系统编程 网络 cjson解析

解析JSON数据的过程,其实就是剥离一个一个链表节点(键值对)的过程。

解析方法如下:

  •  创建链表头指针:

cJSON* cjson_test = NULL;

  •  解析整段JSON数据,并将链表头结点地址返回,赋值给头指针:

解析整段数据使用的API只有一个:

(cJSON *) cJSON_Parse(const char *value);

  •  根据键值对的名称从链表中取出对应的值,返回该键值对(链表节点)的地址

(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);解析JSON数据的过程,其实就是剥离一个一个链表节点(键值对)的过程。
解析方法如下:
① 创建链表头指针:
cJSON* cjson_test = NULL;
② 解析整段JSON数据,并将链表头结点地址返回,赋值给头指针:
解析整段数据使用的API只有一个:
(cJSON *) cJSON_Parse(const char *value);
③ 根据键值对的名称从链表中取出对应的值,返回该键值对(链表节点)的地址
(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);

  •  如果JSON数据的值是数组,使用下面的两个API提取数据:

(int) cJSON_GetArraySize(const cJSON *array);

(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);

解析示例

下面用一个例子来说明如何解析出开头给出的那段JSON数据:

#include 

#include "cJSON.h"

char *message = 

"{                              \

    \"name\":\"mculover666\",   \

    \"age\": 22,                \

    \"weight\": 55.5,           \

    \"address\":                \

        {                       \

            \"country\": \"China\",\

            \"zip-code\": 111111\

        },                      \

    \"skill\": [\"c\", \"Java\", \"Python\"],\

    \"student\": false          \

}";

int main(void)

{

    cJSON* cjson_test = NULL;

    cJSON* cjson_name = NULL;

    cJSON* cjson_age = NULL;

    cJSON* cjson_weight = NULL;

    cJSON* cjson_address = NULL;

    cJSON* cjson_address_country = NULL;

    cJSON* cjson_address_zipcode = NULL;

    cJSON* cjson_skill = NULL;

    cJSON* cjson_student = NULL;

    int    skill_array_size = 0, i = 0;

    cJSON* cjson_skill_item = NULL;

    /* 解析整段JSO数据 */

    cjson_test = cJSON_Parse(message);

    if(cjson_test == NULL)

    {

        printf("parse fail.\n");

        return -1;

    }

    /* 依次根据名称提取JSON数据(键值对) */

    cjson_name = cJSON_GetObjectItem(cjson_test, "name");

    cjson_age = cJSON_GetObjectItem(cjson_test, "age");

    cjson_weight = cJSON_GetObjectItem(cjson_test, "weight");

    printf("name: %s\n", cjson_name->valuestring);

    printf("age:%d\n", cjson_age->valueint);

    printf("weight:%.1f\n", cjson_weight->valuedouble);

    /* 解析嵌套json数据 */

    cjson_address = cJSON_GetObjectItem(cjson_test, "address");

    cjson_address_country = cJSON_GetObjectItem(cjson_address, "country");

    cjson_address_zipcode = cJSON_GetObjectItem(cjson_address, "zip-code");

    printf("address-country:%s\naddress-zipcode:%d\n", cjson_address_country->valuestring, cjson_address_zipcode->valueint);

    /* 解析数组 */

    cjson_skill = cJSON_GetObjectItem(cjson_test, "skill");

    skill_array_size = cJSON_GetArraySize(cjson_skill);

    printf("skill:[");

    for(i = 0; i < skill_array_size; i++)

    {

        cjson_skill_item = cJSON_GetArrayItem(cjson_skill, i);

        printf("%s,", cjson_skill_item->valuestring);

    }

    printf("\b]\n");

    /* 解析布尔型数据 */

    cjson_student = cJSON_GetObjectItem(cjson_test, "student");

    if(cjson_student->valueint == 0)

    {

        printf("student: false\n");

    }

    else

    {

        printf("student:error\n");

    }

    

    return 0;

}

编译:

gcc cJSON.c example2.c -o example2.exe

你可能感兴趣的:(网络,开发语言,linux,tcp/ip,c语言)