我是靠谱客的博主 繁荣烤鸡,最近开发中收集的这篇文章主要介绍cJSON快速入门1 JSON、cJSON简介2 cJSON的结构3 cJSON数据传输4 cJSON操作实例5 参考,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1 JSON、cJSON简介

1.1 What is JSON?

       JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。(来自“开源中国资料)。

1.2 what is cJSON?

       cJSON从名字可知,整个项目都是以极标准的C来写的,意思说,可以跨各种平台使用了。cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。

1.3 cJSON有什么用?

       在很多通讯领域,我们常用到json的通讯格式,然而在嵌入式开发当中我们在使用json格式的协议时,难免会使用到这一个cjson函数库,而使用CJSON和JSON其实只是为了干一件事:那就是解析收到的数据和发送对方能够解析的数据。本文就是给一些CJSON快速入门的操作。

       cJSON,目前来说,就只有两个文件,一个cJSON.c 一个cJSON.h文件。使用的时候,自己创建好一个main.c文件后,将头文件include进去,就可以调用cJSON的API了。

2 cJSON的结构

2.1数据存储方式-键值对

2.1.1 键值对

       JSON里面的多个无序对象(an object)主要是按照键值对(name/value pairs)的方式来存储数据的。例如:

{"name": "John Doe", "age": 18}    

       一个对象以“ { 左括号 开始, “ } 右括号 结束。每个“name”后跟一个” : 冒号 ,“ name/value ”之间使用” , 逗号 分隔。

       上面一共有2对键值对。第1对键名“name”对应的值为“John Doe”;第2对键名“age”对应的值为18;

2.1.2 嵌套键值对

{"address": {"country" : "china", "zip-code": "10000"}}  

       上面键名“address”对应的值是键值对,其中嵌套的键值对共2组;

3 cJSON数据传输

3.1 cJSON数据传输过程图

3.2 cJSON数据编解码API

3.2.1 结构体转换->字符串数据(encoding)

//将CJSON数据转换为字符串(保留原来的格式:例如会保留空格和回车)  
CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);  
//将CJSON数据转换为字符串(删除所有格式,只保留文本)  
CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);  
//将CJSON数据转换为字符串(并且存储到一个buffer里面)  
CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt);  
//将CJSON数据转换为字符串(储存到一个动态申请的空间中)  
CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format);  

3.2.1 字符串数据->结构体转换(decoding)

//将json字符串转换为结构体,并且将其赋给一个指针  
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);  
//将json字符串转换为结构体,并且将其赋给一个指针,常提供一些操作选项供开发者使用  
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);  

3.3 CJSON创建键值对的两种方法

3.3.1 将CJSON对象加入到API形参处

这个方法关键在于,首先需要先创建一个对象然后再将他加入进去。

//将对象Object加入数组或者对象  
CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item);  
CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);   

3.3.2 将键值对(name:value)加入到API形参处

//我们想添加什么数据就可以直接添加,不用另外构建CJSON结构体   
CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);  
CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);  

3.4 CJSON获取键值对的方法

从json结构体里面提取我们想要的键值

//获取数组大小  
CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);  
//获取数组里面的某一个值  
CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);  
//将某一个键值对,提取放到一个cJSON结构体中  
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);  

4 cJSON操作实例

我们使用CJSON其实只有两种操作:
1、编码:构建JSON结构,然后转换为字符串来发送或者做其他的。
2、解码:解析收到的JSON字符串并转成结构体,读取里面的数据,找到对应的值。

4.1 单键值对的编码和解码

4.1.1 编码(encoding)

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include "cJSON.h"  
int main(char argc, char **argv)  
{  
    /***************************创建*********************************/  
    //构建最后用于存放JSON数据的字符串  
    char * json_buffer = { 0 };  
    //首先构造一个根对象指针:  
    cJSON* root = NULL;  
    //创建String对象指针:  
    cJSON* string = NULL;  
    //创建int对象指针:  
    cJSON* int_number = NULL;  
    //创建数组指针:  
    cJSON* array = NULL;  
    int the_array[3] = { 1,2,3 };  
    //创建一个根对象,给root  
    root = cJSON_CreateObject();  
    //创建一个字符串对象,给string  
    string = cJSON_CreateString("hello world");  
    //创建一个int对象,给int_number  
    int_number = cJSON_CreateNumber(10);  
    //创建一个array对象,给array   
    array = cJSON_CreateIntArray(the_array, 3);  
    /***************************添加*********************************/  
    //将字符串string加入根对象,成为一个键值对:  
    //方法一:添加对象  
    cJSON_AddItemToObject(root,"string",string);  
    //方法二:直接添加  
    cJSON_AddStringToObject(root,"string_1","bye world");  
    //添加剩下的  
    cJSON_AddItemToObject(root,"int_number",int_number);  
    cJSON_AddItemToObject(root,"array ",array);  
    /***************************变换*********************************/  
    json_buffer = cJSON_PrintUnformatted(root); 
   if(json_buffer){
         printf("json_buffer is %sn", json_buffer); 
         //因为cJSON_PrintUnformatted函数内部封装有malloc函数,所以使用free函         //数释放被out占用的内存空间,cJSON_Print函数也是一样。 
         free(json_buffer);
   }
   if(root) cJSON_Delete(root);  
    return 0;  
}  

结果如下

json_buffer is {"string":"hello world","string_1":"bye world","int_number":10,"array ":[1,2,3]}  

4.1.2 解码(decoding)

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include "cJSON.h"  
int main(char argc, char **argv)  
{  
    //JSON字符串  
    const char* json_str = 
    "{"name":"json_test","num":20,"arry":[1,2,3]}";  
    cJSON* temp = 0;  
    /****************************解析***********************************/  
    cJSON* json = NULL;  
    cJSON* name = NULL;  
    cJSON* num = NULL;  
    cJSON* arry = NULL;  
    /****************************获取***********************************/  
    //将字符串解析为一个结构体  
    json = cJSON_Parse(json_str);  
    name = cJSON_GetObjectItem(json, "name");  
    num  = cJSON_GetObjectItem(json, "num");  
    arry = cJSON_GetObjectItem(json, "arry");  
  
    printf("name:%sn", name->valuestring);  
    printf("num:%dn", num->valueint);  
    temp = cJSON_GetArrayItem(arry, 1);  
    printf("arry[1]:%dn", temp->valueint);  
    return 0;  
}  

结果如下

name:json_test  
num:20  
arry[1]:2 

 

4.2 嵌套键值对的编码和解码

4.2.1 编码(encoding)

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include "cJSON.h"  
int main(char argc, char **argv)  
{  
    cJSON *json = NULL;  
    cJSON *str  = NULL;  
    cJSON *name_1 = NULL;  
    cJSON *name_2 = NULL;  
    json = cJSON_CreateObject();  
    cJSON_AddItemToObject(json,"string",str = cJSON_CreateArray());  
    cJSON_AddItemToArray(str,name_1 = cJSON_CreateObject());  
    cJSON_AddStringToObject(name_1,"name","boy");  
    cJSON_AddItemToArray(str,name_2 = cJSON_CreateObject());  
    cJSON_AddStringToObject(name_2,"name","gilr");  
    //print  
    char *out = cJSON_PrintUnformatted(json);  
    if(out){  
        printf("%sn",out);  
        free(out);  
    }  
    if(json) cJSON_Delete(json);  
    return 0;  
}  

输出结果

{"string":[{"name":"boy"},{"name":"gilr"}]}  

4.1.2 解码(decoding)

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include "cJSON.h"  
int main(char argc, char **argv)  
{  
    const char *out = "{"string":[{"name":"boy","age":23},{"name":"girl","age":20}]}";  
    cJSON *json = NULL;  
    cJSON *str  = NULL;  
    json = cJSON_Parse(out);  
    if(!json) {  
        printf("get json faild !n");  
        return -1;  
    }  
    str  = cJSON_GetObjectItem(json,"string");  
    if(!str) {  
        printf("get str faild !n");  
        return -1;  
    }  
    int array_size = cJSON_GetArraySize(str);  
    printf("array size is %dn",array_size);  
    int i = 0;  
    char *p = NULL;  
    cJSON *temp = NULL;  
    cJSON *it = NULL;  
    cJSON *it_name = NULL;  
    cJSON *it_age = NULL;  
    for(i = 0;i < array_size; i++){  
        temp = cJSON_GetArrayItem(str,i);  
        if(!temp){  
            printf("get arr_temp faild !n");  
            return -1;  
        }  
        p = cJSON_PrintUnformatted(temp);  
        it = json = cJSON_Parse(p);  
        if(!it){  
            printf("get it faild !n");  
            return -1;  
        }  
        it_name = cJSON_GetObjectItem(it,"name");  
        printf("name:%s ",it_name->valuestring);  
        it_age = cJSON_GetObjectItem(it,"age");  
        printf("name:%dn",it_age->valueint);  
        free(p);  
    }  
    if(json) cJSON_Delete(json);  
    return 0;  
}  

输出结果

array size is 2  
name:boy name:23  
name:girl name:20  

5 参考

1、https://www.json.org/json-zh.html

2、https://blog.csdn.net/fengxinlinux/article/details/53121287?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

3、https://blog.csdn.net/jasper_JA/article/details/103661825

最后

以上就是繁荣烤鸡为你收集整理的cJSON快速入门1 JSON、cJSON简介2 cJSON的结构3 cJSON数据传输4 cJSON操作实例5 参考的全部内容,希望文章能够帮你解决cJSON快速入门1 JSON、cJSON简介2 cJSON的结构3 cJSON数据传输4 cJSON操作实例5 参考所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部