Как найти имя в паре имя / значение, используя cJSON - PullRequest
0 голосов
/ 08 марта 2020

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

1 Ответ

1 голос
/ 01 апреля 2020

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