LINUX.ORG.RU

История изменений

Исправление XMs, (текущая версия) :

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

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


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

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

Зато возможно почитать документацию. Я, например, ни разу ни с 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, :

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

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


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

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

Зато возможно почитать документацию. Я, например, ни разу ни с 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 до этого. И это ещё, по моим меркам, посредственный результат. Как в плане кода, так и в плане затраченного времени.

Делай выводы