*下载地址GitHub - DaveGamble/cJSON: Ultralightweight JSON parser in ANSI C*

直接引入cJSONN库,两个文件分别是cJSON.c和cJSON.h。

C创建JSON字符串

 // 创建json 根节点
 cJSON* root = cJSON_CreateObject();
 
 // 创建json数组
 cJSON* pArray = cJSON_CreateArray();
 //  把数组添加进入跟节点当中 arr1是json名称 名称可以随意 
 cJSON_AddItemToObject(root, "arr1", pArray);
 //添加字符串
 // cJSON_CreateXXX()
 // cJSON_CreateNumber()
 // cJSON_CreateString()
 // cJSON_CreateBool() ...
 cJSON_AddItemToArray(pArray, cJSON_CreateString("str1"));
 cJSON_AddItemToArray(pArray, cJSON_CreateString("str2"));
 cJSON_AddItemToArray(pArray, cJSON_CreateString("str3"));
 
 // 在创建一个数组
 cJSON* pArray1 = cJSON_CreateArray();
 // 新数组添加进入节点中
 cJSON_AddItemToObject(root, "arr2", pArray1);
 for (int i = 0; i < 3; ++i)
 {
     cJSON* obj = cJSON_CreateObject();
     //把对象添加进入json数组中
     cJSON_AddItemToArray(pArray1, obj);
     // 添加元素进入对象中
     cJSON_AddStringToObject(obj, "name", "nameValue");
     cJSON_AddStringToObject(obj, "sex", "sexValue");
     cJSON_AddNumberToObject(obj, "age", 20 + i);
 }
 // 添加普通节点
 cJSON_AddStringToObject(root, "status", "OK");
 
 //返回JSON字符串 需要自动释放否则会内存泄漏 带格式 
 //char* szJSON = cJSON_Print(root);
 //printf("%s", szJSON);
 //free(szJSON);
 
 //cJSON_PrintUnformatted 无格式JSON
 char* szJSON = cJSON_PrintUnformatted(root);
 printf("%s", szJSON);
 free(szJSON);
 
 
 // 是否根节点 必须手动释放,如果数组和新建的对象有关联则会自动释放
 cJSON_Delete(root);

C解析JSON字符串

 char* json = "{\"arr1\":[\"str1\",\"str2\",\"str3\"] \
     ,\"arr2\":[{\"name\":\"nameValue\",\"sex\":\"sexValue\",\"age\":20} \
     ,{\"name\":\"nameValue\",\"sex\":\"sexValue\",\"age\":21} \
     ,{\"name\":\"nameValue\",\"sex\":\"sexValue\",\"age\":22}] \
     ,\"status\":\"OK\"}";
 // 解析json 如果解析失败root == NULL 需要主动判断
 cJSON* root = cJSON_Parse(json);
 // 同上  获取JSON中的对象
 cJSON* arr1 = cJSON_GetObjectItem(root, "arr1");
 cJSON* arr2 = cJSON_GetObjectItem(root, "arr2");
 
 // 获取状态
 cJSON* status = cJSON_GetObjectItem(root, "status");
 // 判断类型释放匹配
 if (status && status->type & cJSON_String)
     printf("%s\n", status->valuestring);
 else
     printf("解析 status 失败\n");
 
 
 if (arr1 && arr1->type && cJSON_Array)
 {
     // 获取数组长度
     int size = cJSON_GetArraySize(arr1);
     for (int i = 0; i < size; ++i)
     {
         cJSON* item = cJSON_GetArrayItem(arr1, i);
         if (item && item->type & cJSON_String)
         {
             printf("arr1:%s\n", item->valuestring);
         }
     }
 }
 if (arr2 && arr2->type && cJSON_Array)
 {
     // 获取数组长度
     int size = cJSON_GetArraySize(arr2);
     for (int i = 0; i < size; ++i)
     {
         cJSON* item = cJSON_GetArrayItem(arr2, i);
         if (item && item->type & cJSON_Object)
         {
             // 这里同样需要判断 我这里省略了
             printf("arr1:%s:%s"
, cJSON_GetObjectItem(item, "name")->string, cJSON_GetObjectItem(item, "name")->valuestring);
             printf("-----%s:%s"
, cJSON_GetObjectItem(item, "sex")->string, cJSON_GetObjectItem(item, "sex")->valuestring);
             printf("-----%s:%d\n"
, cJSON_GetObjectItem(item, "age")->string,cJSON_GetObjectItem(item, "age")->valueint);
         }
     }
 }
 
 cJSON_Delete(root);
最后修改:2022 年 11 月 02 日
如果觉得我的文章对你有用,请随意赞赏