0

我有以下 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 对象的键名和我需要获取值的键名。

4

1 回答 1

0

看看 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 ~]$
于 2020-09-17T07:47:36.760 回答