json-c:从子数组访问值的最简单方法
json-c: Simplest way to access a value from a subarray
{
"name":"John Doe",
"dob":"2005-01-03",
"scores":
{
"math":
{
"lowest":65,
"highest":98
},
"english":
{
"lowest":75,
"highest":80
},
"history":
{
"lowest":50,
"highest":85
}
}
}
使用 json-c 访问上述 JSON 对象中最高数学分数的最简单方法是什么?
是否可以使用类似于 json_object_object_get (jsonobj, "scores.math.highest") 的东西?
如果不是,我是否必须检索每个单独的数组才能获得最高分? IE。先考分数,再考数学,最后拿高分?
谢谢!
查看 JSON-C docs 它似乎没有一种简单的方法来深入了解结构。你必须自己做。像这样:
struct json_object *json_object_get_with_keys(
struct json_object *obj,
const char *keys[]
) {
while( keys[0] != NULL ) {
if( !json_object_object_get_ex(obj, keys[0], &obj) ) {
fprintf(stderr, "Can't find key %s\n", keys[0]);
return NULL;
}
keys++;
}
return obj;
}
向它传递一个以空结尾的键数组,它将向下钻取(或 return 空)。
const char *keys[] = {"scores", "math", "highest", NULL};
struct json_object *obj = json_object_get_with_keys(top, keys);
if( obj != NULL ) {
printf("%s\n", json_object_to_json_string(obj));
}
改用JSON-Glib. It has JSONPath会比较熟悉,可以用$.scores.english.highest
.
JsonNode *result_node = json_path_query(
"$.scores.english.highest",
json_parser_get_root(parser),
&error
);
if( error != NULL ) {
fprintf(stderr, "%s", error->message);
exit(1);
}
/* It returns a node containing an array. Why doesn't it just return an array? */
JsonArray *results = json_node_get_array(result_node);
if( json_array_get_length( results ) == 1 ) {
printf("highest: %ld\n", json_array_get_int_element(results, 0));
}
else {
fprintf(stderr, "Couldn't find it\n");
}
使用起来有点笨拙,但您可以使用一些包装函数来更轻松地处理脚手架和错误处理。
{
"name":"John Doe",
"dob":"2005-01-03",
"scores":
{
"math":
{
"lowest":65,
"highest":98
},
"english":
{
"lowest":75,
"highest":80
},
"history":
{
"lowest":50,
"highest":85
}
}
}
使用 json-c 访问上述 JSON 对象中最高数学分数的最简单方法是什么?
是否可以使用类似于 json_object_object_get (jsonobj, "scores.math.highest") 的东西?
如果不是,我是否必须检索每个单独的数组才能获得最高分? IE。先考分数,再考数学,最后拿高分?
谢谢!
查看 JSON-C docs 它似乎没有一种简单的方法来深入了解结构。你必须自己做。像这样:
struct json_object *json_object_get_with_keys(
struct json_object *obj,
const char *keys[]
) {
while( keys[0] != NULL ) {
if( !json_object_object_get_ex(obj, keys[0], &obj) ) {
fprintf(stderr, "Can't find key %s\n", keys[0]);
return NULL;
}
keys++;
}
return obj;
}
向它传递一个以空结尾的键数组,它将向下钻取(或 return 空)。
const char *keys[] = {"scores", "math", "highest", NULL};
struct json_object *obj = json_object_get_with_keys(top, keys);
if( obj != NULL ) {
printf("%s\n", json_object_to_json_string(obj));
}
改用JSON-Glib. It has JSONPath会比较熟悉,可以用$.scores.english.highest
.
JsonNode *result_node = json_path_query(
"$.scores.english.highest",
json_parser_get_root(parser),
&error
);
if( error != NULL ) {
fprintf(stderr, "%s", error->message);
exit(1);
}
/* It returns a node containing an array. Why doesn't it just return an array? */
JsonArray *results = json_node_get_array(result_node);
if( json_array_get_length( results ) == 1 ) {
printf("highest: %ld\n", json_array_get_int_element(results, 0));
}
else {
fprintf(stderr, "Couldn't find it\n");
}
使用起来有点笨拙,但您可以使用一些包装函数来更轻松地处理脚手架和错误处理。