Я хотел бы использовать модуль cJSON для извлечения некоторых данных из входящей строки JSON. Это то, что я пробовал: Моя строка JSON выглядит так:
char *json = "{\"cmd\":{\"C\":1,\"X\":1000,\"Zcmd\":\"GET POS\"}}";
и вот что мне нужно извлечь из него данные:
int rv = OK;
if (!pStr || !pDat)
return EINVAL;
// parse the JSON data
cJSON *json = cJSON_Parse(pStr);
if (json == NULL) {
const char *error_ptr = cJSON_GetErrorPtr();
if (error_ptr != NULL) {
printf("Error: %s\n", error_ptr);
}
cJSON_Delete(json);
return ENOMSG;
}
// access the JSON data
cJSON *cmd = cJSON_GetObjectItemCaseSensitive(json, "cmd");
if ( cmd ) {
cJSON *C = cJSON_GetObjectItemCaseSensitive(json, "C");
if (cJSON_IsNumber(C) && (C->valueint < CMD_NUM)) {
pDat->C = C->valueint;
}
cJSON *X = cJSON_GetObjectItemCaseSensitive(json, "X");
if (cJSON_IsNumber(X) && (X->valueint)) {
pDat->X = X->valueint;
}
cJSON *Zcmd = cJSON_GetObjectItemCaseSensitive(json, "Zcmd");
if (cJSON_IsString(Zcmd) && (Zcmd->valuestring)) {
strcpy(pDat->Zcmd,Zcmd->valuestring);
}
}
// delete the JSON object
cJSON_Delete(json);
return rv;
}
Однако в моем pDat у меня ничего нет, и я вижу, как cJSON_IsNumber
&& cJSON_IsString
интересно возвращается false
Используйте переменную cmd
, а не json
, при проверке членов объекта cmd
(в противном случае моя программа выдаст ошибку):
#include <cjson/cJSON.h>
#include <stdio.h>
int main() {
cJSON *json = cJSON_Parse("{\"cmd\":{\"C\":1,\"X\":1000,\"Zcmd\":\"GET POS\"}}");
if (!json) {
printf("parse failed\n");
return 1;
}
cJSON *cmd = cJSON_GetObjectItemCaseSensitive(json, "cmd");
if (cmd) {
cJSON *X = cJSON_GetObjectItemCaseSensitive(cmd, "X");
if (X)
printf("isNumber: %d value: %d\n", cJSON_IsNumber(X), X->valueint);
else
printf("X not found\n");
}
cJSON_Delete(json);
}
и пример запуска:
isNumber: 1 value: 1000
Можете ли вы предоставить минимально воспроизводимый пример ?