我有以下 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(例如“元、有效负载、数据”)。
所以,问题是:如何概括上述代码以及我应该使用什么数据结构来存储持有 json 对象的键名和我需要获取值的键名。