0

cJSON提供了一个函数

CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string)

我创建了一个测试功能

#include "cJSON.h"
const char *jsonstring = "{\"b\": {\"b1\":\"2b\"}}";

void jsontest(void)
{
  cJSON *cJSON_data = cJSON_Parse(jsonstring);
  char *buffer = cJSON_Print(cJSON_data);
  printf("JSON_String:%s\r\n",buffer);
  cJSON *bfound = cJSON_GetObjectItemCaseSensitive(cJSON_data,"b1");
  printf("bfound: 0x%08x\n",(char*)bfound);
  free(cJSON_data);
  free(buffer);
}

输出是

JSON_String:{
    "b":    {
        "b1":   "2b"
    }
}

bfound: 0x00000000

`

如果我使用这个字符串,

const char *jsonteststr1 = "{\"a\":\"1\",\"b\":\"2\",\"c\":\"3\"}";

GetObjectItemCaseSensitive()将找到“a”、“b”和“c”。

GetObjectItemCaseSensitive()似乎没有递归。

难道我做错了什么?我不明白如何使用GetObjectItem()

我正在使用版本 1.7.12

4

1 回答 1

1

cJSON_GetObjectItemCaseSensitive(object, string)只能得到 的直接孩子和孩子的兄弟姐妹object,我们无法通过它找到孩子的孩子节点。

如果你想获得 的值2b,那么你应该:

#include "cJSON.h"
const char *jsonstring = "{\"b\": {\"b1\":\"2b\"}}";

void jsontest(void)
{
  cJSON *cJSON_data = cJSON_Parse(jsonstring);
  char *buffer = cJSON_Print(cJSON_data);
  printf("JSON_String:%s\r\n",buffer);
  cJSON *bfound = cJSON_GetObjectItemCaseSensitive(cJSON_data,"b");  // cJSON_data only has a child which named "b"
  cJSON *b1_found = cJSON_GetObjectItemCaseSensitive(bfound, "b1");  // key/value: <b1, 2b> is in b1_found, not bfound
  printf("b1_found: 0x%08x\n",(char*)b1_found);
  printf("bfound: 0x%08x\n",(char*)bfound);

  cJSON_Delete(cJSON_data);  // you should use cJSON_Delete to free the json item.
  free(buffer);
}
于 2020-04-01T08:28:08.370 回答