查看: 1043|回复: 0

[技术交流] cJSON简介

[复制链接]

185

主题

204

帖子

596

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
596
发表于 2022-4-12 16:05:58 | 显示全部楼层 |阅读模式
*cJSON*
cJson是一个用于解析json文件的库,它由c语言编写,开源、使用简单。
*json文件的格式*
整个json文件可以看成由对象,数组,键值对三种元素的各种嵌套组成,各元素使用,分割。
  • 键值对:
    "name":value
    • value
      • bool类型:true、false。如"married":false
      • 数值:可以是浮点值或整型值。如"high":166.9、"age":18、"tmp":2E-3
      • 字符串:如"name":"noName”
      • 对象:如"relation":{}
      • 数组:如"interest":[]


  • 对象:使用{}作为一个整体
  • 数组:使用
    []
    作为一个整体。其内容可以是下面几种元素的任意组合
    • 对象:[{...},{...}]
    • 键值对的value


typedef struct cJSON{
    struct cJSON *next;//兄弟指针,指向后一个节点
    struct cJSON *prev;//兄弟指针,指向前一个节点
    struct cJSON *child;//儿子节点,指向子对象/数组
    int type;           //键值对中value值的类型
    char *valuestring;  //如果type为字符串flag,则此处为value的字符串值
    int valueint;       //如果type为数值flag,则此处为value的整型值
    double valuedouble; //如果type为数值flag,则此处为value的浮点型值
    char *string;       //键值对的name名称
} cJSON;*使用cJSON库生成json文件*#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
#include "string.h"

int main(void)
{
    char *cjson_str = NULL;
    cJSON *root =  cJSON_CreateObject();
    cJSON *relation =  cJSON_CreateObject();
    cJSON *love =  cJSON_CreateObject();
    cJSON *friend =  cJSON_CreateObject();
    cJSON *interest =  cJSON_CreateArray();

    /* 根节点下添加元素 */
    cJSON_AddItemToObject(root, "name", cJSON_CreateString("guoweilkd"));//在对象中插入字符串
    cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(18));          //在对象中插入整型数值
    cJSON_AddItemToObject(root, "high", cJSON_CreateNumber(166.9));      //在对象中插入浮点数值
    cJSON_AddItemToObject(root, "married", cJSON_CreateFalse());         //在对象中插入bool量
    /* 在root节点下添加relation子对象 */
    cJSON_AddItemToObject(root, "relation", relation);
    /* 在relation节点下添加love子对象 */
    cJSON_AddItemToObject(relation, "love", love);
    cJSON_AddItemToObject(love, "name", cJSON_CreateString("noName"));
    cJSON_AddItemToObject(love, "loveTime", cJSON_CreateNumber(6));
    cJSON_AddItemToObject(love, "age", cJSON_CreateNumber(19));

    cJSON_AddItemToObject(friend, "name", cJSON_CreateString("noName"));
    cJSON_AddItemToObject(friend, "loveTime", cJSON_CreateNumber(6));
    cJSON_AddItemToObject(friend, "age", cJSON_CreateNumber(19));
    /* 在relation节点下添加interest子对象 */
    cJSON_AddItemToObject(relation, "interest", interest);
    cJSON_AddItemToArray(interest,cJSON_CreateString("篮球"));  //在数组中插入字符串
    cJSON_AddItemToArray(interest,cJSON_CreateNumber(66.666));  //在数组中插入数值
    cJSON_AddItemToArray(interest,cJSON_CreateNumber(19));
    cJSON_AddItemToArray(interest,cJSON_CreateTrue());          //在数组中插入bool
    cJSON_AddItemToArray(interest,friend);                      //在数组中插入对象

    cjson_str = cJSON_Print(root);  //将json转化为字符串,
   
    /* 将json写入文件 */
    FILE *pf = fopen("test.json","w");
    fwrite(cjson_str,strlen(cjson_str),1,pf);
    fclose(pf);

    free(cjson_str);        //释放cJSON_Print()函数申请的内存
    cJSON_Delete(root);     //删除一个cJSON实体和所有子实体

    return 0;
}
{
    "name": "guoweilkd",
    "age":  18,
    "high": 166.9,
    "married":  false,
    "relation":
        {
        "love":
                {
            "name": "noName",
            "loveTime": 6,
            "age":  19
        },
        "interest":
                ["篮球", 66.666, 19, true,
                    {
                "name": "noName",
                "loveTime": 6,
                "age":  19
                    }
                ]
    }
}*使用cJSON库解析json文件*#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
#include <sys/stat.h>

void main(void)
{
    /* 获取文件大小 */
    struct stat fileBuff;
    stat("test.json",&fileBuff);
    printf("file size:%ld\\n",fileBuff.st_size);

    /* 为解析json文件分配缓存 */
    char *pBuff = (char *)malloc(fileBuff.st_size);
    FILE *pf = fopen("test.json","r");
    fread(pBuff,fileBuff.st_size,1,pf);//将文件读入缓存
    fclose(pf);
    printf("file content:\\n");
    //printf("%s\\n",pBuff);

    /* 解析json文件 */
    cJSON *root = NULL;
    root = cJSON_Parse(pBuff);
    if(root == NULL){
        printf("parse error:%s\\n",cJSON_GetErrorPtr());
        return;
    }

    /* 方式1. 通过属性名查找 */
    cJSON *pName = cJSON_GetObjectItem(root, "name");
    if(pName == NULL){
        printf("error\\n");
    }
    else if(pName->type == cJSON_String){
        printf("%s\\n",pName->valuestring);
    }

    /* 方式2. 按照链表的格式,遍历查找 */
    for(cJSON *pCur = root->child;pCur != NULL; pCur = pCur->next){
        switch(pCur->type){
            case cJSON_Invalid:break;
            case cJSON_False  :printf("%s = false\\n",pCur->string);break;
            case cJSON_True   :printf("%s = true\\n", pCur->string);break;
            case cJSON_NULL   :printf("%s = null\\n", pCur->string);break;
            case cJSON_Number :printf("%s = %d\\n",pCur->string,pCur->valueint);break;
            case cJSON_String :printf("%s = %s\\n",pCur->string,pCur->valuestring);break;
            case cJSON_Array  :printf("%s = array\\n",pCur->string);break;
            case cJSON_Object :printf("%s = object\\n",pCur->string);break;
            default:printf("type:%d\\n",pCur->type);break;
        }
    }

    /* 获取数组大小和元素 */
    cJSON *pTemp = cJSON_GetObjectItem(root, "relation");
    cJSON *pInterest = cJSON_GetObjectItem(pTemp, "interest");
    int ItemsNum = cJSON_GetArraySize(pInterest);   //获取数组大小
    printf("%s items is %d\\n",pInterest->string,ItemsNum);
    for(int i = 0; i < ItemsNum; i++){
        cJSON *pCur = cJSON_GetArrayItem(pInterest,i);
        switch(pCur->type){
            case cJSON_Invalid:break;
            case cJSON_False  :printf("[%d] = false\\n",i);break;
            case cJSON_True   :printf("[%d] = true\\n",i);break;
            case cJSON_NULL   :printf("[%d] = null\\n",i);break;
            case cJSON_Number :printf("[%d] = %f\\n",i,pCur->valuedouble);break;
            case cJSON_String :printf("[%d] = %s\\n",i,pCur->valuestring);break;
            case cJSON_Array  :printf("[%d] = array\\n",i);break;
            case cJSON_Object :printf("[%d] = object\\n",i);break;
            default:printf("type[%d]:%d\\n",i,pCur->type);break;
        }
    }

    /* 获取数组中对象的元素 */
    pTemp = cJSON_GetArrayItem(pInterest,4);
    cJSON *pt = cJSON_GetObjectItem(pTemp, "name");
    printf("%s:%s\\n",pt->string,pt->valuestring);

    cJSON_Delete(root);
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表