C语言--CJSON的使用

源码的下载地址:https://sourceforge.net/projects/cjson/

基本知识

typedef struct cJSON {

    struct cJSON *next, *prev;  

    struct cJSON *child;        

    int type;   

    char *valuestring;          

    int valueint;               

    double valuedouble;     

    char *string;   

} cJSON;

解析/构建JSON数据

难度+

 一层

{
    "id" : "123",  
    "version":"1.0",
    "method":"/sys/adsgag/test_device/thingrvice/propertyt"  
}
解析JSON
#include "stdio.h"
#include "cJSON.h"

typedef struct _DestStr {
    char* id;
    char* version;
    char* method;
}DestStr;


int decode_Json(char *src, DestStr* dest)
{
    cJSON *root = cJSON_Parse(src); // 获取根目录
    if (!root) {
        printf("get root faild !\n");
        return -1;
    }
    cJSON *id = cJSON_GetObjectItem(root, "id");
    if (!id) {
        printf("no id!\n");
        return -1;
    }
    dest->id = malloc(strlen(id->valuestring) + 1);
    if (dest->id == NULL) {
        printf("error!!\n");
    }
    strncpy(dest->id, id->valuestring, strlen(id->valuestring));
    dest->id[strlen(id->valuestring)] = '\0';


    cJSON *version = cJSON_GetObjectItem(root, "version");
    if (!version) {
        printf("no version!\n");
        return -1;
    }
    dest->version = malloc(strlen(version->valuestring) + 1);
    if (dest->version == NULL) {
        printf("error!!\n");
    }
    strncpy(dest->version, version->valuestring, strlen(version->valuestring));
    dest->version[strlen(version->valuestring)] = '\0';

    cJSON *method = cJSON_GetObjectItem(root, "method");
    if (!method) {
        printf("no method!\n");
        return -1;
    }
    dest->method = malloc(strlen(method->valuestring) + 1);
    if (dest->method == NULL) {
        printf("error!!\n");
    }
    strncpy(dest->method, method->valuestring, strlen(method->valuestring));
    dest->method[strlen(method->valuestring)] = '\0';

    if (root)
        cJSON_Delete(root);
    return 0;
}

int main(void)
{
    DestStr* dest = (DestStr*)malloc(sizeof(DestStr));
    char* srcStr = "{\n\"id\" : \"123\",\n\"version\" : \"1.0\",\n\"method\" : \"/sys/adsgag/test_device/thingrvice/propertyt\"\n}";
    decode_Json(srcStr, dest);

    printf("dest->id:%s\n", dest->id);
    printf("dest->version:%s\n", dest->version);
    printf("dest->method:%s\n", dest->method);
    return 0;
}
构建JSON
#include "stdio.h"
#include "cJSON.h"

char* encode_Json() // 构建
{
    cJSON * pJsonRoot = NULL;
    pJsonRoot = cJSON_CreateObject();
    if (NULL == pJsonRoot)
    {
        //error happend here
        return NULL;
    }
    cJSON_AddStringToObject(pJsonRoot, "id", "123");
    cJSON_AddStringToObject(pJsonRoot, "version", "1.0");
    cJSON_AddStringToObject(pJsonRoot, "method", "/sys/adsgag/test_device/thingrvice/propertyt");
//  cJSON_AddNumberToObject(pJsonRoot, "version", 10010);
//  cJSON_AddBoolToObject(pJsonRoot, "bool", 1);
    char * p = cJSON_Print(pJsonRoot);
    if (NULL == p)
    {
        cJSON_Delete(pJsonRoot);
        return NULL;
    }
    cJSON_Delete(pJsonRoot);
    return p;
}


int main(void)
{

    printf("encode_Json:%s\n",encode_Json());

    return 0;
}

难度++

二层

{
    "id" : "123",  
   "version":"1.0", 
    "params" : {   
        "swtich" : 1,
        "usedTime": "50.5"
    },
  "method":"/sys/adsgag/test_device/thingrvice/propertyt"  
}
解析JSON
#include "stdio.h"
#include "cJSON.h"

typedef struct _DestStr {
    char* id;
    char* version;
    char* method;
    int swtich;
    char* usedTime;
}DestStr;


int decode_Json(char *src, DestStr* dest)
{
    cJSON *root = cJSON_Parse(src); // 获取根目录
    if (!root) {
        printf("get root faild !\n");
        return -1;
    }
    cJSON *id = cJSON_GetObjectItem(root, "id");
    if (!id) {
        printf("no id!\n");
        return -1;
    }
    dest->id = malloc(strlen(id->valuestring) + 1);
    if (dest->id == NULL) {
        printf("error!!\n");
    }
    strncpy(dest->id, id->valuestring, strlen(id->valuestring));
    dest->id[strlen(id->valuestring)] = '\0';


    cJSON *version = cJSON_GetObjectItem(root, "version");
    if (!version) {
        printf("no version!\n");
        return -1;
    }
    dest->version = malloc(strlen(version->valuestring) + 1);
    if (dest->version == NULL) {
        printf("error!!\n");
    }
    strncpy(dest->version, version->valuestring, strlen(version->valuestring));
    dest->version[strlen(version->valuestring)] = '\0';

    cJSON *method = cJSON_GetObjectItem(root, "method");
    if (!method) {
        printf("no method!\n");
        return -1;
    }
    dest->method = malloc(strlen(method->valuestring) + 1);
    if (dest->method == NULL) {
        printf("error!!\n");
    }
    strncpy(dest->method, method->valuestring, strlen(method->valuestring));
    dest->method[strlen(method->valuestring)] = '\0';


    cJSON *params = cJSON_GetObjectItem(root, "params"); // 子节点
    if (!params) {
        printf("no params!\n");
        return -1;
    }
    cJSON *swtich = cJSON_GetObjectItem(params, "swtich"); // 从子节点里面找
    if (!swtich) {
        printf("no swtich!\n");
        return -1;
    }
    dest->swtich = swtich->valueint;

    cJSON *usedTime = cJSON_GetObjectItem(params, "usedTime");
    if (!usedTime) {
        printf("no usedTime!\n");
        return -1;
    }

    dest->usedTime = malloc(strlen(usedTime->valuestring) + 1);
    if (dest->usedTime == NULL) {
        printf("error!!\n");
    }
    strncpy(dest->usedTime, usedTime->valuestring, strlen(usedTime->valuestring));
    dest->usedTime[strlen(usedTime->valuestring)] = '\0';

    if (root)
        cJSON_Delete(root);
    return 0;
}

int main(void)
{
    DestStr* dest = (DestStr*)malloc(sizeof(DestStr));
    char* srcStr = "{\n\"id\" : \"123\",\n\"version\" : \"1.0\",\n\"params\" : {\n\"swtich\" : 1,\n\"usedTime\" : \"50.5\"\n},\n\"method\" : \"/sys/adsgag/test_device/thingrvice/propertyt\"\n}";
    decode_Json(srcStr, dest);

    printf("dest->id:%s\n", dest->id);
    printf("dest->version:%s\n", dest->version);
    printf("dest->method:%s\n", dest->method);
    printf("dest->swtich:%d\n", dest->swtich);
    printf("dest->usedTime:%s\n", dest->usedTime);
    return 0;
}
构建JSON
#include "stdio.h"
#include "cJSON.h"

char* encode_Json() // 构建
{
    cJSON * pJsonRoot = NULL; // 创建父节点
    pJsonRoot = cJSON_CreateObject();
    if (NULL == pJsonRoot)
    {
        //error happend here
        return NULL;
    }
    cJSON_AddStringToObject(pJsonRoot, "id", "123");
    cJSON_AddStringToObject(pJsonRoot, "version", "1.0");
    cJSON_AddStringToObject(pJsonRoot, "method", "/sys/adsgag/test_device/thingrvice/propertyt");
    //  cJSON_AddNumberToObject(pJsonRoot, "version", 10010);
    //  cJSON_AddBoolToObject(pJsonRoot, "bool", 1);

    cJSON * pSubJson = NULL;      // 创建子节点
    pSubJson = cJSON_CreateObject();
    if (NULL == pSubJson)
    {
        // create object faild, exit
        cJSON_Delete(pJsonRoot);
        return NULL;
    }
    cJSON_AddNumberToObject(pSubJson, "swtich", 1);
    cJSON_AddNumberToObject(pSubJson, "useTime",50.5);
    cJSON_AddItemToObject(pJsonRoot, "params", pSubJson);  // 子节点的“键”,子节点挂在父节点上


    char * p = cJSON_Print(pJsonRoot);
    if (NULL == p)
    {
        cJSON_Delete(pJsonRoot);
        return NULL;
    }
    cJSON_Delete(pJsonRoot);
    return p;
}


int main(void)
{

    printf("encode_Json:%s\n", encode_Json());

    return 0;
}

难度+++

三层

{
    "id" : "123",  
   "version":"1.0", 
    "params" : {   
        "RGB" : {
            "R":110,
            "G":2,
            "B":50
        },
        "swtich" : 1,
        "usedTime": "50.5"
    },
  "method":"/sys/adsgag/test_device/thingrvice/propertyt"  
}
解析JSON
#include "stdio.h"
#include "cJSON.h"

typedef struct _DestStr {
    char* id;
    char* version;
    char* method;
    int swtich;
    char* usedTime;
    int R;
    int G;
    int B;
}DestStr;


int decode_Json(char *src, DestStr* dest)
{
    cJSON *root = cJSON_Parse(src); // 获取根目录
    if (!root) {
        printf("get root faild !\n");
        return -1;
    }
    cJSON *id = cJSON_GetObjectItem(root, "id");
    if (!id) {
        printf("no id!\n");
        return -1;
    }
    dest->id = malloc(strlen(id->valuestring) + 1);
    if (dest->id == NULL) {
        printf("error!!\n");
    }
    strncpy(dest->id, id->valuestring, strlen(id->valuestring));
    dest->id[strlen(id->valuestring)] = '\0';


    cJSON *version = cJSON_GetObjectItem(root, "version");
    if (!version) {
        printf("no version!\n");
        return -1;
    }
    dest->version = malloc(strlen(version->valuestring) + 1);
    if (dest->version == NULL) {
        printf("error!!\n");
    }
    strncpy(dest->version, version->valuestring, strlen(version->valuestring));
    dest->version[strlen(version->valuestring)] = '\0';

    cJSON *method = cJSON_GetObjectItem(root, "method");
    if (!method) {
        printf("no method!\n");
        return -1;
    }
    dest->method = malloc(strlen(method->valuestring) + 1);
    if (dest->method == NULL) {
        printf("error!!\n");
    }
    strncpy(dest->method, method->valuestring, strlen(method->valuestring));
    dest->method[strlen(method->valuestring)] = '\0';


    cJSON *params = cJSON_GetObjectItem(root, "params"); // 子节点
    if (!params) {
        printf("no params!\n");
        return -1;
    }
    cJSON *swtich = cJSON_GetObjectItem(params, "swtich"); // 从子节点里面找
    if (!swtich) {
        printf("no swtich!\n");
        return -1;
    }
    dest->swtich = swtich->valueint;

    cJSON *usedTime = cJSON_GetObjectItem(params, "usedTime");
    if (!usedTime) {
        printf("no usedTime!\n");
        return -1;
    }

    dest->usedTime = malloc(strlen(usedTime->valuestring) + 1);
    if (dest->usedTime == NULL) {
        printf("error!!\n");
    }
    strncpy(dest->usedTime, usedTime->valuestring, strlen(usedTime->valuestring));
    dest->usedTime[strlen(usedTime->valuestring)] = '\0';

    cJSON* rgb = cJSON_GetObjectItem(params, "RGB"); // 孙节点
    if (!rgb) {
        printf("no RGB!\n");
        return -1;
    }
    cJSON* r_ = cJSON_GetObjectItem(rgb, "R");
    if (!r_) {
        printf("no R!\n");
        return -1;
    }
    dest->R = r_->valueint;

    cJSON* g_ = cJSON_GetObjectItem(rgb, "G");
    if (!g_) {
        printf("no G!\n");
        return -1;
    }
    dest->G = g_->valueint;

    cJSON* b_ = cJSON_GetObjectItem(rgb, "B");
    if (!b_) {
        printf("no B!\n");
        return -1;
    }
    dest->B = b_->valueint;


    if (root)
        cJSON_Delete(root);
    return 0;
}

int main(void)
{
    DestStr* dest = (DestStr*)malloc(sizeof(DestStr));
    char* srcStr = "{\n\"id\" : \"123\",\n\"version\" : \"1.0\",\n\"params\" : {\n\"RGB\" : {\n\"R\":110,\n\"G\" : 2,\n\"B\" : 50\n}, \n\"swtich\" : 1,\n\"usedTime\" : \"50.5\"\n}, \n\"method\":\"/sys/adsgag/test_device/thingrvice/propertyt\"\n}";
    decode_Json(srcStr, dest);

    printf("dest->id:%s\n", dest->id);
    printf("dest->version:%s\n", dest->version);
    printf("dest->method:%s\n", dest->method);
    printf("dest->swtich:%d\n", dest->swtich);
    printf("dest->usedTime:%s\n", dest->usedTime);
    printf("dest->R:%d\n", dest->R);
    printf("dest->G:%d\n", dest->G);
    printf("dest->B:%d\n", dest->B);
    return 0;
}
构建JSON
#include "stdio.h"
#include "cJSON.h"

char* encode_Json() // 构建
{
    cJSON * pJsonRoot = NULL; // 创建父节点
    pJsonRoot = cJSON_CreateObject();
    if (NULL == pJsonRoot)
    {
        //error happend here
        return NULL;
    }
    cJSON_AddStringToObject(pJsonRoot, "id", "123");
    cJSON_AddStringToObject(pJsonRoot, "version", "1.0");
    cJSON_AddStringToObject(pJsonRoot, "method", "/sys/adsgag/test_device/thingrvice/propertyt");
    //  cJSON_AddNumberToObject(pJsonRoot, "version", 10010);
    //  cJSON_AddBoolToObject(pJsonRoot, "bool", 1);

    cJSON * pSubJson = NULL;      // 创建子节点
    pSubJson = cJSON_CreateObject();
    if (NULL == pSubJson)
    {
        // create object faild, exit
        cJSON_Delete(pJsonRoot);
        return NULL;
    }
    cJSON_AddNumberToObject(pSubJson, "swtich", 1);
    cJSON_AddNumberToObject(pSubJson, "useTime",50.5);
    cJSON_AddItemToObject(pJsonRoot, "params", pSubJson);  // 子节点的“键”,子节点挂在父节点上

    cJSON * pSSubJson = NULL;      // 创建孙节点
    pSSubJson = cJSON_CreateObject();
    if (NULL == pSSubJson)
    {
        // create object faild, exit
        cJSON_Delete(pJsonRoot);
        return NULL;
    }
    cJSON_AddNumberToObject(pSSubJson, "R", 110);
    cJSON_AddNumberToObject(pSSubJson, "G", 2);
    cJSON_AddNumberToObject(pSSubJson, "B", 50);
    cJSON_AddItemToObject(pSubJson, "RGB", pSSubJson);  // 孙节点的“键”,孙节点挂在子节点上

    char * p = cJSON_Print(pJsonRoot);
    if (NULL == p)
    {
        cJSON_Delete(pJsonRoot);
        return NULL;
    }
    cJSON_Delete(pJsonRoot);
    return p;
}


int main(void)
{

    printf("encode_Json:%s\n", encode_Json());

    return 0;
}
cJSON是一个轻量级的JSON解析器和生成器,它可以在C语言使用。cJSON提供了一种方便的方式来解析和生成JSON数据,使得在C语言中处理JSON数据变得更加简单。以下是cJSON的一些常见用法。 ## 解析JSON数据 首先需要将JSON字符串转换成cJSON对象,然后根据需要获取对象的值。 ```c char* json_str = "{\"name\":\"Tom\",\"age\":20,\"gender\":\"male\"}"; cJSON* json = cJSON_Parse(json_str); if (json != NULL) { cJSON* name = cJSON_GetObjectItem(json, "name"); if (cJSON_IsString(name) && (name->valuestring != NULL)) { printf("name: %s\n", name->valuestring); } cJSON* age = cJSON_GetObjectItem(json, "age"); if (cJSON_IsNumber(age)) { printf("age: %d\n", age->valueint); } cJSON* gender = cJSON_GetObjectItem(json, "gender"); if (cJSON_IsString(gender) && (gender->valuestring != NULL)) { printf("gender: %s\n", gender->valuestring); } cJSON_Delete(json); } ``` 在上面的代码中,我们首先定义了一个JSON字符串,并使用`cJSON_Parse()`函数将其转换成cJSON对象。然后,我们使用`cJSON_GetObjectItem()`函数获取对象的值,该函数需要传入要获取的值的key。最后,我们使用`cJSON_IsString()`和`cJSON_IsNumber()`函数来检查获取到的值是否为字符串或数字类型。 ## 生成JSON数据 我们可以使用cJSON来生成JSON数据,并将其转换成JSON字符串。 ```c cJSON* json = cJSON_CreateObject(); if (json != NULL) { cJSON_AddStringToObject(json, "name", "Tom"); cJSON_AddNumberToObject(json, "age", 20); cJSON_AddStringToObject(json, "gender", "male"); char* json_str = cJSON_Print(json); printf("json_str: %s\n", json_str); free(json_str); cJSON_Delete(json); } ``` 在上面的代码中,我们首先使用`cJSON_CreateObject()`函数创建一个cJSON对象。然后,我们使用`cJSON_AddStringToObject()`和`cJSON_AddNumberToObject()`函数向对象中添加值。最后,我们使用`cJSON_Print()`函数将对象转换成JSON字符串,并使用`free()`函数释放内存。需要注意的是,在使用完cJSON对象后,需要使用`cJSON_Delete()`函数将其删除以释放内存。 ## 数组操作 cJSON还支持数组操作。 ```c cJSON* json = cJSON_CreateArray(); if (json != NULL) { cJSON* name1 = cJSON_CreateString("Tom"); cJSON_AddItemToArray(json, name1); cJSON* name2 = cJSON_CreateString("Mary"); cJSON_AddItemToArray(json, name2); char* json_str = cJSON_Print(json); printf("json_str: %s\n", json_str); free(json_str); cJSON_Delete(json); } ``` 在上面的代码中,我们首先使用`cJSON_CreateArray()`函数创建一个cJSON数组对象。然后,我们使用`cJSON_CreateString()`函数创建两个字符串对象,并使用`cJSON_AddItemToArray()`函数将它们添加到数组中。最后,我们使用`cJSON_Print()`函数将对象转换成JSON字符串,并使用`free()`函数释放内存。 以上是cJSON的一些常见用法,可以帮助我们在C语言中更加方便地处理JSON数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值