LINUX.ORG.RU

распарсить json данные

 ,


0

4

Есть данные в формате json. Нужно использовать либо си библиотеку, например json,json-c,json-glib. или c++ библиотеку jsoncpp. Нужно получить нужные данные из json данных. Как это сделать?

Нужно получить нужные данные из json данных. Как это сделать?

ЯтЪ, тупее вопроса я не слышал. Можешь хотя бы указать в чём у тебя проблема их получить?

AntonyRF ★★★★
()
Ответ на: комментарий от AntonyRF

Можешь хотя бы указать в чём у тебя проблема их получить?

Проблема в незнании ЯП. Я скидывал ему пример по jsoncpp, но он не осилил.

Meyer ★★★★★
()
Ответ на: комментарий от AntonyRF

ЯтЪ, тупее вопроса я не слышал.

Что ты, больно умный? Как ты отличишься своим умом? Покажешь свой пример как мне получить все данные или будешь ссылки давать на другие сайты, потому как сам не понимаешь что нужно написать?

Можешь хотя бы указать в чём у тебя проблема их получить?

Приходят много данных где двух уровневый справочник, из этих данных с помощью glib-json я могу получить только связку industries, id, name. Тогда как «Услуги для населения» уже не могу получить.

GET /industries возвращает двухуровневый справочник всех отраслей.

[
  {
    "id": "49",
    "name": "Услуги для населения",
    "industries": [
        {
            "id": "49.408",
            "name": "Ритуальные услуги"
        }
    ]
  }
]

В справочнике возможны другие значения.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от Meyer

Вот эту Head First C.

Да нафиг, я ее читал. Помню потом заглядывал в книгу не один раз. Особенно сложно было понять как пользоваться списком, но потом понел.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от Meyer

Проблема в незнании ЯП. Я скидывал ему пример по jsoncpp, но он не осилил.

Ну а ты сам можешь написать? Ты видел что в том примере делают, а теперь обрати внимание что мне нужно. А теперь покажи мне пример, где можно получить данные из массива и обратиться к двух уровнему справочнику. Мне нужно чтобы было написано, как я писал, чтобы настроить, получить, все.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Что ты, больно умный? Как ты отличишься своим умом?

Просто не вероятно умный, в отличие от тебя. Но тебе это не осознать.

Покажешь свой пример как мне получить все данные или будешь ссылки давать на другие сайты, потому как сам не понимаешь что нужно написать?

На Си тоже сойдёт или исключительно С++?

AntonyRF ★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Ну а ты сам можешь написать?

Могу. Я так понимаю, тебе нужно, чтобы все сделали за тебя?

Ты видел что в том примере делают, а теперь обрати внимание что мне нужно. А теперь покажи мне пример, где можно получить данные из массива и обратиться к двух уровнему справочнику.

В том примере было и это.

Meyer ★★★★★
()
Ответ на: комментарий от AntonyRF

Просто не вероятно умный, в отличие от тебя. Но тебе это не осознать.

Не осознать чего, что у тебя в голове больше знаний? Ты что идиот?

На Си тоже сойдёт или исключительно С++?

На си. Двухуровневый.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

На си. Двухуровневый.

Ты что, настолько не ценишь свое время? Или до сих пор не понял, что за тебя никто ничего делать не будет? Загугли уже наконец «pure c json parsing example» или поищи на StackOverflow, там наверняка кто-то уже подобный вопрос задавал, причем неоднократно.

Meyer ★★★★★
()
Ответ на: комментарий от Meyer

В том примере было и это.

Процетируй? Потому как я этот пример до тебя наверное находил. И кто-то писал типа что yourlib нет такого класса, а ему в ответ что yourlib это должнен быть твой класс. Я еще раз глянул, там нет ничего. Видимо ты не понел что мне нужно.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от Meyer

Ты что, настолько не ценишь свое время?

Тебе что самому не интересно помочь мне и получить новые знания? Или ты учишь только то, что учителя говорят.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

И кто-то писал типа что yourlib нет такого класса, а ему в ответ что yourlib это должнен быть твой класс.

Прекрати, а то у меня скоро припадок будет))

Meyer ★★★★★
()
Ответ на: комментарий от Meyer

Или до сих пор не понял, что за тебя никто ничего делать не будет?

Ну видишь как, те кто пишут сюда, считают себя умнее меня, а на деле сами ищут примеры в сети. Хоть кто с опытом попался чтоли, а то пишут здесь то, что я и сам искал или могу найти в сети.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Ну видишь как, те кто пишут сюда, считают себя умнее меня, а на деле сами ищут примеры в сети.

Напиши в Job и предложи за это деньги. Там дело минут на 10, но все равно никто за просто так ничего делать не будет.

Meyer ★★★★★
()
Ответ на: комментарий от Meyer

Загугли уже наконец «pure c json parsing example» или поищи на StackOverflow, там наверняка кто-то уже подобный вопрос задавал, причем неоднократно.

Ну ты сам подумай, зачем мне такие советы, которые сравнимы с тем, что я например сам могу найти. Ты мне напиши то что я немогу сделать.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Не осознать чего, что у тебя в голове больше знаний? Ты что идиот?

Прекрати, а то я со смеху умру)))

AntonyRF ★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Что ты шутишь чтоли? Сам то хочешь чтобы тебе за деньги помогали?

Помощь != «сделайте все за меня» в большинстве случаев. Если бы мне понадобился второй вариант, я бы заплатил.

Meyer ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Может когда ты стремаешься ходить с наркотой советовать ходить под стол для начала?

мне тоже нужна какая-нибудь библиотека, чтобы эту твою фразу распарсить

MyTrooName ★★★★★
()
Ответ на: комментарий от Meyer

Если бы мне понадобился второй вариант, я бы заплатил.

Так смысл такого форума, если я например искал ответ на свой вопрос в сети, много чего посмотрел, не смог найти нужного примера. Написал здесь. А здесь мне как помогают, дают мне ссылки на сайты, на которых я уже бывал. Если честно, то здесь почти нет людей, которые разбираются в том что мне нужно. Большинство заходят поболтать, написать в google мой вопрос, скопировать ссылку на страницу и отослать мне.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Большинство заходят поболтать, написать в google мой вопрос, скопировать ссылку на страницу и отослать мне.

Как я уже говорил, тебе в раздел Job. Пили тему а-ля «Сделайте все за меня, плачу столько-то». Просто так никто ничего делать не будет.

скопировать ссылку на страницу и отослать мне.

Это все, что люди могут бесплатно.

Meyer ★★★★★
()
Последнее исправление: Meyer (всего исправлений: 2)

С тредов этого погромиста с 47 хромосомами ору не переставая.
Даже ничего писать не хочется, он сам все выдает как надо.
Давайте, мужики, жгите дальше.

whoami
()
Ответ на: комментарий от u0atgKIRznY5

Ты мне напиши то что я немогу сделать.

Да легко!

  • Писать грамотно по-русски;
  • Осилить хоть какой-нибудь язык программирования;
  • Научиться гуглить;
  • Включить голову;
  • Прекратить зафлуживать ЛОР своим тупняком.

Хотя, с последним я, наверное, погорячился. Доставляет!

Deleted
()
Ответ на: комментарий от Meyer

По началу да, было весело, но сейчас пора уже забан.

Одно дело когда вы по теме помогаете, а другое когда тупняк разводите. Толку от вас никакого.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Здесь короче спецов нет, одни незнайки строящие из себя грамотеев.

Ну если ты такой спец, то почему по готовому примеру и документации к API не смог решить эту тривиальную задачу?

Meyer ★★★★★
()
Ответ на: комментарий от Meyer

Ну если ты такой спец, то почему по готовому примеру и документации к API не смог решить эту тривиальную задачу?

Я спец? Я что смог понять, то сделал. Ты можешь понять как надо, так напиши. Тебе же польза будет, потом понадобиться, а ты уже умеешь, и времени на это меньше потратишь. Только не говори что ты ссылку давал, там нет примера, который нужен.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Ты можешь понять как надо, так напиши. Тебе же польза будет, потом понадобиться, а ты уже умеешь, и времени на это меньше потратишь.

Окей, предлагаю сделку. Я тебе напишу развернутый пример работы с jsoncpp с комментариями на русском языке. С тебя - выложить пароль от аккаунта в толксах ;)

Meyer ★★★★★
()
Ответ на: комментарий от Meyer

С тебя - выложить пароль от аккаунта в толксах ;)

Нет, давай ты напишешь развернутый ответ, а потом когда будешь на хорошую работу устраиваться покажешь что помогал другим людям и делился своими знаниями. Так посмотрят, подумают что ты хороший человек.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Нет, давай ты напишешь развернутый ответ, а потом когда будешь на хорошую работу устраиваться покажешь что помогал другим людям и делился своими знаниями. Так посмотрят, подумают что ты хороший человек.

Не-не, это не интересно. Подумай - с меня полный готовый пример работы с jsoncpp, а с тебя - всего лишь самозабаниться. P.S Я уже закончил с этой штукой.

Meyer ★★★★★
()
Ответ на: комментарий от Meyer

Подумай - с меня полный готовый пример работы с jsoncpp

Видишь как я на тебя хорошо влияю, ты научился чему то нового. Только видимо ты не любишь делиться своими знаниями. Ну ладно, если ты не предоставишь мне свой пример, то я тебя заблокирую.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

тебе пример на jansson подойдет? опиши точнее, что на входе, что на выходе. допустим, распарсили мы жсон тавой - дальше что? как ты отображать двухуровневый список собрался в своей программе?

conalex ★★★
()
Ответ на: комментарий от u0atgKIRznY5

подумают что ты хороший человек

Я уже думаю, что он хороший человек. Посмотри, как он терпеливо с тобой разговаривает.

i-rinat ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Видишь как я на тебя хорошо влияю, ты научился чему то нового. Только видимо ты не любишь делиться своими знаниями.

«Кто владеет информацией, тот владеет миром.» (c). Скидывай почту, чтобы я тебе tar с исходником послал, и уходи в бан наконец.

Meyer ★★★★★
()
Ответ на: комментарий от conalex

тебе пример на jansson подойдет?

пойдет, но хорошо бы и на glib-json.

опиши точнее, что на входе, что на выходе.

Получаю json данные от hh.ru с запросом industries.

как ты отображать двухуровневый список собрался в своей программе?

Я сначала на c++ писал, но перепишу на си и буду строить приложение на gtk. Ну видимо данные будут отображаться в treeview. Это я пока на выбор взял разобрать этот ответ, а так там другие будут, нужно еще придумать дизайн и все такое.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от Meyer

Скидывай почту, чтобы я тебе tar с исходником послал, и уходи в бан наконец.

А что там много? Есть пример в несколько строчек? naidv88@gmail.com. Забаниться невозможно, ошибка операции.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Проверь почту. Надеюсь, помог разобраться. Там все очень просто. И прекрати постить тупняк.

Я сначала на c++ писал, но перепишу на си и буду строить приложение на gtk.

Что мешает взять gtkmm и не мучать людей?

Meyer ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

https://pastebin.com/sVpFPmjL

для компиляции нужно установить dev-пакеты для libcurl и libjansson.

за основу взят пример отсюда - https://jansson.readthedocs.io/en/2.10/tutorial.html

удачи.

conalex ★★★
()
Последнее исправление: conalex (всего исправлений: 1)
Ответ на: комментарий от Meyer

Что мешает взять gtkmm и не мучать людей?

Не хочу пока.

Проверь почту. Надеюсь, помог разобраться. Там все очень просто. И прекрати постить тупняк.

Спасибо. Выглядит действительно просто.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

я например искал ответ на свой вопрос в сети, много чего посмотрел, не смог найти нужного примера

Прочитай «Как правильно задавать вопросы». Там описано, как надо спрашивать и как воспринимать ответы.


Если честно, то здесь почти нет людей, которые разбираются в том что мне нужно

Невозможно знать всё, и, даже если у отвечающего есть опыт в нужной тебе области, что-то банально может забыться. А ещё надо понимать, что любой ответ — это время. Которое, как известно, деньги. И если кто-то тебе отвечает, почти наверняка это происходит во время рабочего времени, которое можно и нужно потратить на рабочие проекты, либо в своё свободное время, лишая себя отдыха. Поэтому обычно выбирают то, что сделать быстрее — в данном случае кинуть ссылку, нежели разбираться в твоём коде. Ситуации, когда отвечают в транспорте, либо когда написание ответов и есть форма отдыха, не рассматриваю.

Зато возможно почитать документацию. Я, например, ни разу ни с json-c, ни с json-cpp дела не имел. Вот вообще. Просто ради интереса и опыта нашёл на гитхабе документацию, почитал. Один раз погуглил, как работать с массивами, так как в документации ничего похожего не нашёл. Написал вот это:

#include <json-c/json_object.h>
#include <json-c/json_object_iterator.h>
#include <json-c/json_tokener.h>
#include <stdlib.h>
#include <stdio.h>



static const char *_str = "[                \
  {                                         \
    \"id\": \"49\",                         \
    \"name\": \"Услуги для населения\",     \
    \"industries\": [                       \
        {                                   \
            \"id\": \"49.408\",             \
            \"name\": \"Ритуальные услуги\" \
        }                                   \
    ]                                       \
  }                                         \
]";

static int iterate(json_object *obj);
static int print(json_object *obj);

int main(void)
  {
	enum json_tokener_error jerr;
	json_object *root;

	root = json_tokener_parse_verbose(_str, &jerr);
	if (jerr != json_tokener_success)
	  {
		fputs(json_tokener_error_desc(jerr), stderr);
		return EXIT_FAILURE;
	  }

	return print(root);
  }



int iterate(json_object *obj)
  {
	struct json_object_iterator it  = json_object_iter_begin(obj),
	                            end = json_object_iter_end(obj);

	while(!json_object_iter_equal(&it, &end))
	  {
		/* Do not end with newline yet */
		printf("%s: ", json_object_iter_peek_name(&it));
		if (print(json_object_iter_peek_value(&it)) != EXIT_SUCCESS)
			return EXIT_FAILURE;

		json_object_iter_next(&it);
	  }

	return EXIT_SUCCESS;
  }



int print(json_object *obj)
  {
	json_type type = json_object_get_type(obj);

	switch(type)
	  {
		case json_type_array:
		  {
			puts("[");
			int length = json_object_array_length(obj);
			for (int i = 0; i < length; i++)
				if (print(json_object_array_get_idx(obj, i)) != EXIT_SUCCESS)
					return EXIT_FAILURE;
			puts("]");

			break;
		  }

		case json_type_object:
			return iterate(obj);

		case json_type_boolean:
			puts(json_object_get_boolean(obj) == TRUE? "true": "false");
			break;

		case json_type_double:
			printf("%f", json_object_get_double(obj));
			break;

		case json_type_int:
			printf("%d", json_object_get_int(obj));
			break;

		case json_type_null:
			puts("<null>");
			break;

		case json_type_string:
			puts(json_object_get_string(obj));
			break;
	  }

	return EXIT_SUCCESS;
  }

Код далёк от совершенства, в нём не проводится никаких проверок на ошибки (в main() — не в счёт), и, тем не менее, преспокойно обойдёт любой корректный json. Его я написал меньше, чем за два часа, повторюсь, ни разу не работая с JSON до этого. И это ещё, по моим меркам, посредственный результат. Как в плане кода, так и в плане затраченного времени.

Делай выводы

XMs ★★★★★
()
Последнее исправление: XMs (всего исправлений: 1)
Ответ на: комментарий от conalex

Вот что получилось и вывод правильный, ура.

#include <stdio.h>
#include <jansson.h>

int main ( )
{
	json_t *root;
	json_error_t error;

	root = json_load_file ( "json_data", 0, &error );

	if ( !root ) {
		fprintf ( stderr, "error: %d %s\n", error.line, error.text );
		return -1;
	}

	if ( !json_is_array ( root ) ) {
		fprintf ( stderr, "error: %d %s\n", error.line, error.text );
		return -1;
	}

	for ( int i = 0; i < json_array_size ( root ); i++ ) {
		json_t *category, *item_of_category, *name_of_category, *name_of_item;

		category = json_array_get ( root, i );
		if ( !json_is_object ( category ) ) {
			fprintf ( stderr, "error: %d %s\n", error.line, error.text );
			return -1;
		}

		name_of_category = json_object_get ( category, "name" );
		if ( !json_is_string ( name_of_category ) ) {
			fprintf ( stderr, "error: %d %s\n", error.line, error.text );
			return -1;
		}
		printf ( "->%s\n", json_string_value ( name_of_category ) );

		item_of_category = json_object_get ( category, "industries" );
		if ( !json_is_array ( item_of_category ) ) {
			fprintf ( stderr, "error: %d %s\n", error.line, error.text );
			return -1;
		}

		for ( int i = 0 ; i < json_array_size ( item_of_category ); i++ ) {
			json_t *array_of_item = json_array_get ( item_of_category, i );
			if ( !json_is_object ( array_of_item ) ) {
				fprintf ( stderr, "error: %d %s\n", error.line, error.text );
				return -1;
			}
			name_of_item = json_object_get ( array_of_item, "name" );
			if ( !json_is_string ( name_of_item ) ) {
				fprintf ( stderr, "error: %d %s\n", error.line, error.text );
				return -1;
			}
			printf ( "\t%s\n", json_string_value ( name_of_item ) );
		}
	}

}

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

for ( int i = 0; i < json_array_size ( root ); i++ ) {
for ( int i = 0 ; i < json_array_size ( item_of_category ); i++ )

Желаю получать массивы по паре миллиардов элементов каждый. Кто говорил, что любит быстрое?

XMs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.