概述
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 参考所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复