2017-10-12 93 views
-1

我有一个json格式的字符串。我正在使用jansson库。Json解析数据并通过提供密钥获取值

{"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地址value.But在这里,我所面临的问题,因为json_object_get接受一个JSON对象。但recvBuff->数据是uint8_t类型,它的值是我提供的字符串。所以我尝试了类型转换,但它不起作用。 是否有反正我可以将字符串转换为json对象并使用json_object_get?

+0

看看json_loads –

回答

1

首先,你需要告诉杨松将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; 
} 

那么你可以尝试找到你的键/值对。这可以在2种口味来完成:

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); 

对于其他值类型不是“字符串”您需要调整格式字符串"{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));