我有一个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?
答案 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));