簡體   English   中英

用 cJSON 解析 JSON

[英]Parsing JSON with cJSON

我正在嘗試使用 cJSON 解析 JSON 文件。 代碼中沒有錯誤,但我沒有從 JSON 文件中獲得正確的值。

測試.json

{
    "log_enable": "1",
    "log_level": "1",
    "device": [
        {
            "ip": "10.27.15.176",
            "port": 80,
            "max_users": 8,
            "auth": 0
        },
        {
            "ip": "10.27.15.176",
            "port": 81,
            "max_users": 8,
            "auth": 0
        }
    ]
}

我試圖從上面的 JSON 文件中獲取值。 還有一個問題,它沒有輸入 cJSON_ArrayForEach 來獲取 ip 和端口的值:

void parse_json(char *json_buff,int len)
{
    cJSON * node = NULL;
    cJSON * data_log_enable = NULL;
    cJSON * data_log_level;
    cJSON * data_device;
    char *string;
    cJSON * device1;
    node = cJSON_Parse(json_buff);
    if (NULL == node)
    {
        return;
    }
    
    data_log_enable = cJSON_GetObjectItemCaseSensitive(node, "log_enable");
    if (data_log_enable && data_log_enable->data)
    {
        log_enable = atoi(p_log_enable->data);
        printf("log_enable - %d\n",log_enable);
    }

    data_log_level = cJSON_GetObjectItemCaseSensitive(node, "log_level");
    if (data_log_level && data_log_level->data)
    {
        log_level = atoi(data_log_level->data);
        printf("log_level - %d\n",log_level);
    }
    
    data_device = cJSON_GetObjectItemCaseSensitive(node, "device");
    /*
    cJSON_ArrayForEach(device1, p_device);
    {
        printf("In Array:");
        cJSON *ip = cJSON_GetObjectItemCaseSensitive(device1, "ip");
        cJSON *port = cJSON_GetObjectItemCaseSensitive(device1, "port");
    } 
    */
    while (data_device && soap_strcmp(data_device->name, "device") == 0)
    {   

        F_DEVICE * fst_device = (F_DEVICE *)malloc(sizeof(F_DEVICE));
        if (fst_device)
        {
         // if true, it will get the 'max_users' and 'auth' and do the rest
        }

        data_device = data_device->next;
    }   


    cJSON_Delete(node);
}

我嘗試打印一些值,結果如下:

log_enable - 81
log_level - 0

字符串值存儲在struct cJSONvaluestring成員中,因此獲取"log_enable"值的正確方法是:

data_log_enable = cJSON_GetObjectItemCaseSensitive(node, "log_enable");
if (cJSON_IsString(data_log_enable ) && (data_log_enable ->valuestring != NULL))
{
    log_enable = atoi(data_log_enable ->valuestring);
}

您可以查看 cJSON 的 README 以獲取更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM