c-为json的不同嵌套级别提取不同的密钥集



我有以下JSON对象,我需要从中检索某些键的值。例如,在外部JSON对象中,我只需要";时间戳";以及";类型";,从嵌套的";元";对象我只需要";版本";,并且从嵌套的";有效载荷";我想要字段";"原因"类型";以及";条件";从其嵌套对象";数据";

{
"timestamp": "1568961295627",
"type": "test",
"namespace": "internal",
"meta": {
"version": "2.0-test",
"id": "123"
},
"payload": {
"data": {
"reason": "user_request",
"type": "asd",
"condition": "bad"
},
"contentType": "application/json"
}
}

我写了一个函数来检索这样的数据:

void log_values(json_t *data) {
json_t *obj = NULL;
json_t *nested = NULL;
syslog(LOG_INFO, "%s: ", json_string_value(json_object_get(data, "timestamp")));
syslog(LOG_INFO, "%s: ", json_string_value(json_object_get(data, "type")));
obj = json_object_get(data, "meta");
syslog(LOG_INFO, "%s: ", json_string_value(json_object_get(obj, "version")));
obj = json_object_get(data, "payload");
nested = json_object_get(obj, "data");
syslog(LOG_INFO, "%s: ", json_string_value(json_object_get(nested, "reson")));
syslog(LOG_INFO, "%s: ", json_string_value(json_object_get(nested, "type")));
syslog(LOG_INFO, "%s: ", json_string_value(json_object_get(nested, "condition")));
}

然而,代码看起来是重复的,我想知道是否有任何方法可以概括它?首先想到的是创建一个锯齿状的指针数组,指向每个阶段所需的键,然后遍历该数组,只检索特定嵌套级别上的特定键,例如:

char *nested0 = {"timestamp", "type"};
char *nested1 = {"anomaly", "version"};
char *nested2 = {"reason", "type", "condition"};
char *(*keys[])[] = { &nested0, &nested1, &nested2 }

但是,这种解决方案并不能解决将指向嵌套JSON(例如"meta,payload,data"(的密钥名称存储在哪里的问题。

因此,问题是:如何概括上述代码,以及我应该使用什么数据结构来存储持有json对象的键的名称和我需要获取值的键。

看看jsmn,它应该符合您的需求:https://github.com/zserge/jsmn

使用jsmn可以做什么的示例:

[user@machine ~]$ ./json_parser_with_keys test.json timestamp type meta/version
timestamp=1568961295627
type=test
meta/version=2.0-test
[user@machine ~]$ ./json_parser_full test.json
/timestamp=1568961295627
/type=test
/namespace=internal
/meta/version=2.0-test
/meta/id=123
/payload/data/reason=user_request
/payload/data/type=asd
/payload/data/condition=bad
/payload/contentType=application/json
[user@machine ~]$

最新更新