Json解析数据并通过提供密钥获取值

时间:2017-10-12 05:40:28

标签: c json

我有一个json格式的字符串。我正在使用jansson库。

{"ip": null, "hostname": null, "updated_at": 1507729189,"device_category": "Unknown", "device_name": "Unknown", "device_family": "Unknown", "mac": "005056bd7f9c", "added_at": 1507729189}

我需要获取与密钥对应的值。

json_t *data = NULL;
if(!(data = json_object_get((json_t *)&recvBuff->data, "mac")))
{
    status = ERROR;
    goto exit;
}
strcpy(client_data->clientMac, json_string_value(data));

在上面的代码中我试图获取mac地址值。但是在这里我面临的问题是json_object_get接受一个json对象。但是recvBuff->数据是uint8_t类型,它的值是我提供的字符串。所以我尝试了类型转换,但它没有用。 无论如何,我可以将字符串转换为json对象并使用json_object_get?

1 个答案:

答案 0 :(得分:1)

首先,您需要告诉jansson将JSON字符串解析为层次结构以供进一步使用:

json_error_t error;
json_p = json_load_file(recvBuff->data, JSON_DISABLE_EOF_CHECK, &error);
if (json_p == NULL)
{
  LOG_PRINT(LOGLEVEL_ERROR, "Loading json string failed: %s - %s; pos=%u\n",
                             error.text, error.source, error.position);
  status = ERROR;
  goto _exit;
}

然后您可以尝试找到您的键/值对。这可以通过两种方式完成:

1)

int result;
char *mac_value_p = NULL;
result = json_unpack(json_p, "{s:s}", "mac", &mac_value_p);
if (result)
{
  status = ERROR;
  goto _exit;
}
// mac_value_p now points to a string holding the value.
strcpy(client_data->clientMac, mac_value_p);

对于除“string”之外的其他值类型,您需要调整格式字符串"{s:s}"。 使用此方法,您还可以一次查询不同键的多个值。

2)

json_t *mac_p = NULL;
mac_p = json_object_get(json_p, "mac");
if (!mac_p || !json_is_string(mac_p))
{
  status = ERROR;
  goto exit;
}
// mac_p now points to a json_t object of type string.
strcpy(client_data->clientMac, json_string_value(mac_p));