我使用的是json-c库,在查看了文档后,我找不到一种方法可以在不使用一堆循环的情况下获得深度嵌套的键/值,下面是我尝试过的:
json_object_object_foreach(json_data_obj, key, val) {
printf("KEY:%st VAL:%sn", key, json_object_to_json_string(val));
/* TODO: Traverse the JSON
* "results" => "channel" => "item" => "condition" => "temp"
*/
}
这是输出:
KEY:query VAL:{ "count": 1, "created": "2015-04-10T06:05:12Z", "lang": "en-US", "results": { "channel": { "item": { "condition": { "code": "33", "date": "Thu, 09 Apr 2015 9:55 pm PDT", "temp": "56", "text": "Fair" } } } } }
如果不多次使用json_object_foreach()宏,如何获取临时值
同时(由于json-c 0.13),可以通过使用json_c-visive函数遍历对象树来访问深度嵌套的对象。
int json_c_visit (
json_object * jso,
int future_flags,
json_c_visit_userfunc * userfunc,
void * userarg
)
该函数走到json文档的每个对象,并调用用户定义的函数userfunc
。还可以使用userfunc的返回值来引导遍历树。以单元测试和预期输出为例,说明如何使用该函数。
您可能必须为每个对象调用json_object_get_ex,直到找到所需的键/值对,并在此过程中检查每个键的存在。
可能还有另一种方法,但这是我在最近一个处理同样复杂的JSON数据的项目中不得不做的。
下面的代码假设b包含您的JSON字符串。
json_object *json_obj, *results_obj, *channel_obj, *item_obj, *condition_obj,*temp_obj;
int exists;
char *temperature_string;
json_obj = json_tokener_parse(b);
exists=json_object_object_get_ex(json_obj,"results",&results_obj);
if(exists==false) {
printf(""results" not found in JSON");
return;
}
exists=json_object_object_get_ex(results_obj,"channel",&channel_obj);
if(exists==false) {
printf("key "channel" not found in JSON");
return;
}
exists=json_object_object_get_ex(channel_obj,"item",&item_obj);
if(exists==false) {
printf("key "item" not found in JSON");
return;
}
exists=json_object_object_get_ex(item_obj,"condition",&condition_obj);
if(exists==false) {
printf("key "condition" not found in JSON");
return;
}
exists=json_object_object_get_ex(condition_obj,"temp",&temp_obj);
if(exists==false) {
printf("key "temp" not found in JSON");
return;
}
temperature_string = json_object_get_string(temp_obj); //temperature_string now contains "56"