LINUX.ORG.RU

Не понимаю как распарсить json

 , , ,


1

2
dron@gnu:~/vktray$ ./vktray   | json_pp
{
   "response" : [    
      16695,
      {
         "body" : "Приятного аппетита",
         "mid" : 53785,
         "date" : 1483788918,
         "title" : "",
         "out" : 0,
         "read_state" : 1,
         "uid" : 1730456445
      },
      {
         "mid" : 53784,
         "date" : 1483788918,
         "body" : "Кушаю тоже",
         "read_state" : 1,
         "uid" : 1730654564,
         "title" : "",
         "out" : 0
      }
   ]
}

Что в json-c что в jansson я не понимаю как получить поля body. Вернее даже не это я не могу понять.

я получаю значение response и тут всё у меня затуп, дальше идёт массив из которых нужно получить объекты, а из объектов по ключу значения. Значения то я могу получить, я непойму как из массива объекты брать. Вечер, голова болит, пните в нужном направлении. Мне пинок хоть по jansson хоть по json-c нужен.

★★★★★

давно не работал с jansson, на память пришло что-то типа

json_t *response = json_object_get (json_in, "response");
json_t *object_0 = json_array_get (response, 0);
json_t *object_1 = json_array_get (response, 1);
const char *body = json_string_value (object_1, "body");
conalex ★★★ ()
Последнее исправление: conalex (всего исправлений: 3)
Ответ на: комментарий от neon1ks

Я не против посмотреть как это делается там.

Dron ★★★★★ ()

в jansson сперва итератором по массиву, в итераторе гетом по полю:

json_t * responce = json_object_get(main_obj, "responce");

size_t index = 0;
json_t *elem;

json_array_foreach(responce, index, elem)
{
	json_t *body = json_object_get(elem, "body");

	if(json_is_string(body))
		printf("body id %s\n", json_string_value(body));

}

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

cast conalex вот ещё вопрос, это бага или фича что json_array_foreach не перечисляет объекты в массиве? jansson 2.9-1 входные данные как в шапке

struct json_t * root =  json_loads(json,0,NULL);
struct json_t * response =  json_object_get(root,"response");
assert(response);
if(json_is_array(response))
{
    json_t * value;
    size_t index;
    json_array_foreach(response,index,value);
    {
        if(json_is_object(value))
        {
            const char *key;
            struct json_t * val;
            json_object_foreach(value,key,val)
            {    
                printf("%s\n",key);
            };
        };
    };
}else{
printf("error\n");
}

я получаю только 1 объект из массива

dron@gnu:~/vktray$ ./vktray 
out
date
read_state
mid
uid
title
body
dron@gnu:~/vktray$ 

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

вот, да, опередил, я ниже привёл пример аналогичны и ловлю на нём непонятку вроде баг

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

ахаахахах ирнат ты лапушка ой lol , пора заканчивать на сегодня, смотрю в книгу вижу фигу :D

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

Я было хотел взять твоё Эдик, т.к. маленькое, но ты сказал что у тебя GPLv3, а у меня изначально прицел на MIT,был бы MIT/BSD взял бы, да не смотря на весёлый пример от i-rinat где фэйл. А так jansson уже.

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

у меня изначально прицел на MIT

Ну и ССЗБ.

несмотря на весёлый пример от i-rinat где фэйл

Пофиг, оно ж для мини.

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

Ну и ССЗБ.

ну не скажи.

Пофиг, оно ж для мини.

ну я и сказал что «не смотря на»

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

Пусть страдают ССЗБ.

ССЗБ это те, кто решил случайную либу с интернета заюзать?

Советовать либу с известным багом, который запросто стрельнет в продакшене — довольно подло, ты не находишь?

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

с известным багом

Там, вообще-то, написано, что она простая. Для простых жосонов. А сложные нафиг не нужны: как только появляется мегавложенный сложный жосон, так сразу надо это говно менять на что-нибудь другое.

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