CJSON介绍及使用

1. JSON简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,可以把JSON的结构理解成无序的、可嵌套的key-value键值对集合,这些key-value键值对以结构体或数组的形式来组织的。同一级的key-value键值对之间用一个,(逗号)隔开,每个key-value键值对是由一个key后面紧接一个:(冒号),冒号后面是这个key对应的value。key是一个word,由大小写字母、下划线及数字组成,可以由双引号封闭,也可以不用双引号。而value的取值集为:number、boolean(true、false)、null、string、object和array。

2. CJSON

cJSON是C语言写的一个JSON解析库,项目地址http://sourceforge.net/projects/cjson/,用起来比较简单、方便。

看过CJSON的源代码,可以看到实际是使用一个双链表来记录JSON数据,然后对这个双链表进行增删改查操作。

CJSON,只有两个文件,cJSON.c,cJSON.h,使用时,可在自己的test.c文件中包含cJSON.h文件,在编译时,将test.c和cJSON.c一起编译,即:

gcc test.c cJSON.c -g -lm -o test

3.cJSON使用

借用已有博客上的例子,简要演示cJSON的使用:

假设有名为test的文件,文件内容如下:

{  
        "name":"EVDI",  
        "data":{  
            "id":1,  
            "username":"hahaya",  
            "userpass":"123456",  
            "version"  
        }  
    }  

自己写的处理该文件的程序为test.c,文件的内容如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include "cJSON.h"  //需要把该头文件放在后面包含  否则会找不到size_t
//解析JSON
void parse_json(const char *filename)
{
    printf("----------------parse json start-------------------------------\n");
    
    //从文件中读取要解析的JSON数据
    FILE *fp = fopen(filename, "r");
    fseek(fp, 0, SEEK_END);
    long len = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    char *data = (char*)malloc(len + 1);
    fread(data, 1, len, fp);
    fclose(fp);
    printf("%s", data);
    //解析JSON数据
    cJSON *root_json = cJSON_Parse(data);    //将字符串解析成json结构体
    if (NULL == root_json)
    {
        printf("error:%s\n", cJSON_GetErrorPtr());
        cJSON_Delete(root_json);
        return;
    }
    //"name":"EVDI"
    cJSON *name_json = cJSON_GetObjectItem(root_json, "name");
    if (name_json != NULL)
    {
        char *name = cJSON_Print(name_json);    //将JSON结构体打印到字符串中 需要自己释放
        printf("name:%s\n", name);
        free(name);
    }
    //"data":"..."
    //id
    cJSON *data_json = cJSON_GetObjectItem(root_json, "data");
    int id = cJSON_GetObjectItem(data_json, "id")->valueint;
    printf("id:%d\n", id);
    //username
    char *username = cJSON_Print(cJSON_GetObjectItem(data_json, "username"));
    printf("username:%s\n", username);
    free(username);
    //userpass
    char *userpass = cJSON_Print(cJSON_GetObjectItem(data_json, "userpass"));
    printf("userpass:%s\n", userpass);
    free(userpass);
    //version
    char *version = cJSON_Print(cJSON_GetObjectItem(data_json, "version"));
    printf("version:%s\n", version);
    free(version);
    free(data);
 
    printf("----------------parse json end--------------------------------\n");
}
//创建JSON
void create_json()
{
    printf("----------------create json start-----------------------------\n");
    //组JSON
    cJSON *root_json = cJSON_CreateObject();
    cJSON_AddItemToObject(root_json, "name", cJSON_CreateString("EVDI"));
    cJSON *data_json = cJSON_CreateObject();
    cJSON_AddItemToObject(root_json, "data", data_json);
    //添加的另一种方式:cJSON_AddNumberToObject(data_json, "id", 1);通过源码发现仅仅是对cJSON_AddItemToObject的define
    cJSON_AddItemToObject(data_json, "id", cJSON_CreateNumber(1));
    //添加的另一种方式:cJSON_AddStringToObject(data_json, "username", "hahaya");
    cJSON_AddItemToObject(data_json, "username", cJSON_CreateString("hahaya"));
    cJSON_AddItemToObject(data_json, "userpass", cJSON_CreateString("123456"));
    cJSON_AddItemToObject(data_json, "version", cJSON_CreateString("1.0"));
    //打印JSON
    char *out = cJSON_Print(root_json);
    printf("%s\n", out);
    free(out);
    printf("----------------create json end-------------------------------\n");
}
int main()
{
    parse_json("test");
    create_json();
    return 0;
}

进入cJSON的目录下,执行下面命令编译程序:

gcc test.c cJSON.c -g -lm -o test

执行命令./test 运行程序,得到输出结果如下:


cJSON 是C语言中的一个 JSON 编解码器,非常轻量级,C文件只有 500 多行,速度也非常理想。

cJSON 也存在几个弱点,虽然功能不是非常强大,但 cJSON 的小身板和速度是最值得赞赏的。其代码被非常好地维护着,结构也简单易懂,可以作为一个非常好的C语言项目进行学习。

参考:

http://hahaya.github.io/use-cJSON/

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值