Имена ключей в json-c

Я использую json-c для анализа следующей строки JSON:

{
  "root": {
    "a": "1",
    "b": "2",
    "c": "3"
  }
}

И у меня есть следующий код C. Приведенный выше JSON хранится в переменной b.

json_object *new_obj, *obj1, *obj2;
int exists;

new_obj = json_tokener_parse(b); 
exists=json_object_object_get_ex(new_obj,"a",&obj1); 
if(exists==false) { 
  printf("key \"a\" not found in JSON"); 
  return; 
} 
exists=json_object_object_get_ex(new_obj,"b",&obj2); 
if(exists==false) { 
  printf("key \"b\" not found in JSON"); 
  return; 
}

Какое правильное имя ключа использовать для получения значения из ключа «a» с помощью json_object_get_ex?

То, что у меня есть, не работает (существует неверно для обоих запросов) для JSON, который у меня есть выше, но работает для следующего JSON. Я уверен, что это связано с непониманием того, какой ключ использовать для «пути» к ключу «а».

{      
   "a": "1",
   "b": "2",
   "c": "3"
}

person cigarman    schedule 17.04.2015    source источник
comment
Кажется, вы должны сначала получить корневой объект, а затем из этого объекта получить объекты a и b.   -  person caveman    schedule 18.04.2015
comment
Ваш вопрос теперь содержит ответ. Возможно, вам следует извлечь ответ в самостоятельный ответ, а затем, со временем (через пару дней), вы сможете принять его (за это нет баллов) и закрыть вопрос.   -  person Jonathan Leffler    schedule 18.04.2015
comment
Джонатан, спасибо, я именно так и сделаю.   -  person cigarman    schedule 18.04.2015


Ответы (1)


Хорошо, я понял это, и, как я уже сказал, я неправильно понял, как json-c анализирует исходный текст JSON и представляет его как родительский и дочерний узлы.

Этот следующий код работает. Проблема заключалась в том, что я пытался получить дочерние узлы из исходного json_object, что было неправильно. Сначала мне нужно было получить корневой объект, а затем получить дочерние объекты из корня.

json_object *new_obj, *root_obj, *obj1, *obj2;
int exists;

new_obj = json_tokener_parse(b); 
exists=json_object_object_get_ex(new_obj,"root",&root_obj);
if(exists==false) { 
  printf("\"root\" not found in JSON"); 
  return; 
} 
exists=json_object_object_get_ex(root_obj,"a",&obj1); 
if(exists==false) { 
  printf("key \"a\" not found in JSON"); 
  return; 
} 
exists=json_object_object_get_ex(root_obj,"b",&obj2); 
if(exists==false) { 
  printf("key \"b\" not found in JSON"); 
  return; 
}
person cigarman    schedule 18.04.2015