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