在c语言里用到json格式的字符串,拼接起来就很麻烦,如果数据大,需要申请空间,如果中间要再插入一个子项,还需要麻烦的拷贝拼接。用cJSon库的好处就是:

1、拼接、插入方便。临时增加,修改,直接用对于的接口来实现,快速,方便。
2、空间申请问题由接口底层去实现。如果拼接很多,内存问题我们不用去过多考虑,只要知道怎么用就可以避免内存泄露问题。
3、格式统一。书写方便,可能有些地方会加中括号,有些没有。用这个可以省掉这种麻烦。
4、使用拓展方便。需要临时增加,或者再加入内容,比较便捷,高效。不用再自己用一大串的转义符加双引号来拼接了。

1、JSON格式:一对大括号,相当于XML的头和尾,内部全是键值对

{"name" : "apple","sex"  : "famale","high" : "178","girls":["alice", "ruby", "kit"],"家电" :{"TV":"changhong"}
}

注:结合JSON视图工具,可以把JSON数据结构化展示出来,清晰明了

1、一对大括号括起内容
2、内部使用key:value key值为字符串value值可以取值:字符串、数值类型、数组类型[]、对象{}、NULL、布尔值

2、cJSON库

在GitHub上下载对应的cJSON库(cJson-master),注:解码后内部只有cJSON.h和cJSON.c可以供我们使用,也就是直接使用cJSON的源码,用时把这两个文件拷到开发目录下即可

/*内部函数简介:*/
1、cJson_Parse(char*)  //用于解析利用C字符串存储的json字符串会生成一个cJSON格式的结构体
2、cJson_Print(cJson*) //用于输出json字符串解析后的数据把cJSON结构体转换成C字符串
3、cJson_Delete(cJson*)//释放cJson*类型数据

简单使用:

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"int main(void)
{char *data = "{\"love\":[\"LOL\", \"Go shopping\"]}";//解析data字符串,存储成cJSON结构体cJSON *json = cJSON_Parse(data);char *json_data = NULL;printf("data : %s\n", json_data = cJSON_Print(json));free(json_data);cJSON_Delete(json);return 0;
}

注:测试文件需要使用数学库,需要加入-lm

加数学库:-lm
注:不是-lmath
floor:向下取整
ceil:向上取整

3、基于JSON相关的C库函数,生成对应的json文件

注:快捷方式:[ + d:快速列出宏定义

<1>创建一个值类型的数据

注:不管什么类型的数据转换后都是cJSON结构体

extern cJSON* cJSON_CreateNumber(double num)
extern cJSON* cJSON_CreateString(const char *string)
extern cJSON* cJSON_CreateArray(void)

<2>创建一个对象(文档)

extern cJSON* cJSON_CreateObject(void); //创建json对象,相当于创建了一对{}

<3>数组创建及添加

cJSON* cJSON_CreateIntArray(const int *numbers, int count)
void cJSON_AddItemToArray(cJSON *array, cJSON *item)
//例子
cJSON* array = NULL;
cJSON_AddItemToArray(array, cJSON_CreateString("LOL"));
cJSON_AddItemToArray(array, cJSON_CreateString("NBA"));
cJSON_AddItemToArray(array, cJSON_CreateString("Shopping"));

4、JSON嵌套

<1>向对象中增加键值对

cJSON_AddItemToObject(root, "rows", 值数据类型的相关函数());

<2>在对象中增加数组

cJSON_AddItemToObject(root, "rows", cJSON_CreateArray());

<3>向数组中增加对象

cJSON_AddItemToArray(rows, cJSON_CreateObject());

<4>几个可以提高操作效率的宏函数

#define cJSON_AddNumberToObject(object, name, n) \cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
#define cJSON_AddStringToObject(object, name, s) \cJSON_AddItemToObejct(object, name, cJSON_CreateString(s))

<5>添加一个元素到json对象中:cJSON_AddItemToObject(json, "key", value)

value取值:字符串   ---》cJSON_CreateString("value");数值     ---》cJSON_CreateNumber(29);数组     ---》cJSON_CreateArray(void);对象     ---》cJSON_CreateObject(void);

5、json文件创建方法

    ----》json = cJSON_CreateObject(); //相当于创建一个大括号----》cJSON_AddItemToObject(json, "name", cJSON_CreateString("hmh")) //json对象加元素
{    "name":"hmh", ---->cJSON_CreateString("hmh")"age":28,
}

6、创建json文件案例

注:gcc -o demo test2.c cJSON.* -lm

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "cJSON.h"
int main(void)
{//创建一个空的文档对象cJSON* json = cJSON_CreateObject();//向文档中增加一个键值对{"name":"hmh"}//======>cJSON_AddStringToObject(json, "name", "hmh")cJSON_AddItemToObject(json, "name", cJSON_CreateString("hmh"));cJSON_AddItemToObject(json, "age", cJSON_CreateNumber(29));cJSON* array = NULL;cJSON_AddItemToObject(json, "love", array = cJSON_CreateArray());cJSON_AddItemToArray(array, cJSON_CreateString("LOL"));cJSON_AddItemToArray(array, cJSON_CreateString("NBA"));cJSON_AddItemToArray(array, cJSON_CreateString("Shopping"));//宏的使用cJSON_AddNumberToObject(json, "score", 59);cJSON_AddStringToObject(json, "address", "beijing");//将json结构体格式化到缓冲区char *buf = cJSON_Print(json);//打开文件用以写入json数据FILE *fp = fopen("test2.json", "w");fwrite(buf, 1, strlen(buf), fp);free(buf);fclose(fp);//释放json结构体所占的内存cJSON_Delete(json);return 0;
}

7、特别注意

在上面我们对cJSON进行了一些简单分析,包括解析、打包这两种最常用功能,cJSON的移植相对简单,但是在使用的时候,还是有一些特别需要注意的地方的,这 主要是因为 cJSON库 中的一些函数会进行内存申请操作,但是并不会自动释放内存,这就相当于 是风险, 需要使用者自己去及时的释放 内存。如果处理不当,会造成内存用完,进而程序也运行不了多久就废掉了。所以需要特别注意的地方:

(1)使用cJSON_Parse创建一个 cJSON指针后,用完务必 使用 cJSON_Delete函数释放 该cJSON指针。

(2)使用cJSON_Createxxx函数创建 json对象后, 用完务必使用 cJSON_Delete函数释放 该cJSON指针。

(3)使用 cJSON_Print函数 将cJSON数据 解析成 char 字符串后,务必使用 cJSON_free函数释放 该char指针,这个 细节隐藏的很深,因为cJSON_Print 函数不光是 print打印,他会 调用cJSON_malloc 申请内存,所以用完 必须要释放 掉 该char 指针。

cJSON_Delete(root);    //非常重要!!!!!!
CJSON_free(payload);   //非常重要!!!!!!

cJSON库的使用(一)相关推荐

  1. cJSON库源码分析

    cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的Json格式解析库. 那什么是Json格式?这里照搬度娘百科的说法: Json(JavaScript Object Notat ...

  2. python json库安装_win 安装python的cjson库

    机器重装,也意味着俺python的cjson库也的重装,又是一路坎坷,于是乎把网上搜到的安装过程东拼西凑成适合自己的: 下载:从http://pypi.python.org/pypi/python-c ...

  3. Cjson 库的使用

    cJSON,目前来说,主要的文件有两个,一个 cJSON.c 一个 cJSON.h.使用的时候,将头文件 include 进去即可. 如果是在 Linux 操作系统中使用,编译 到时候需要添加数学库 ...

  4. cJSON库用法详解

    cJSON库用法详解_宁静致远2021的博客-CSDN博客_cjson cJSON库用法详解 问题和需要注意的地方 一.JSON.cJSON简介 1. JSON 简介 2. JSON 语法 3. 开源 ...

  5. cJSON库如何在KIEL4上使用?

    各位我在keil4 下面使用cjson库,可是编译出来很多问题,无法运行,是什么原因呢?有没有什么解决方法,望各位大神多多指点,另外用单片机怎样解析json格式的数据!

  6. VisualFreeBasic调用超轻量级JSON解析器cJSON库

    VisualFreeBasic之所以能吸引我有几个原因 1.语法简单,跟VB的语法极度相似 2.生成的程序提交极小,空项目只有151K 3.勇芳封装了大量的WinAPI和自定义函数,可以大大的减轻程序 ...

  7. cjson构建_[置顶] cJSON库(构建json与解析json字符串)-c语言

    一.c语言获取json中的数据. 1.先要有cJOSN库,两个文件分别是cJSON.c和cJSON.h. 2.感性认识 char * json = "{ \"json\" ...

  8. 第三方库介绍——cJSON库

    文章目录 综述 API cJSON结构体 数据的封装 Json 对象操作 Json 数组操作 序列化 Json 字符串的解析 内存释放 Json 数据的封装 Json 对象操作举例 Json 数组操作 ...

  9. cJSON库的使用详情,cJSON动态库制作

    文章目录 cJSON库的使用详情 什么是JSON? 一.cJSON动态库制作: 二.cJSON介绍 1.json数据表示方式 2.cJSON的结构体 3.cJSON宏定义的类型type 4.字符串生成 ...

  10. C语言cJSON库的使用,解析json数据格式

    对于c语言来说是没有字典这样的结构的,所以对于解析json格式的数据来说不是那么好解析,但是有些时候又会需要处理这样的数据格式,这里就有一个解析json的函数库可以给我们使用了.这个函数库就是cJSO ...

最新文章

  1. 可汗学院向量入门 矩阵入门
  2. ORACLE建视图 授权的 例子
  3. cmd锁定计算机病毒,反病毒常用CMD命令大全
  4. java遍历两个日期_java 已知两个日期,遍历出两个日期之间所有的日期,重点是::包括第一个日期!!...
  5. ym——Android之ListView性能优化
  6. 全国计算机等级考试二级笔试样卷Java语言程序设计
  7. web.xml 中的listener、 filter、servlet 加载顺序及其详解
  8. 解题:USACO15JAN Grass Cownoisseur
  9. java查询类提供的方法_查询一个类的方法和构建器的JAVA程序
  10. 按120分计算成绩 mysql_Mysql实用教程试卷B.doc
  11. 洛谷P4092树——并查集
  12. ModelMap和ModelAndView的作用
  13. C#开源项目一览表[转](包含国内和国外)
  14. extjs4.1单击treepanel节点收缩叶子节点
  15. kali linux卸载lnmp,kali linux 如何安装lnmp 1.2
  16. 书海拾贝|开发艺术探索之 android 的消息机制
  17. 学计算机为什么伤眼,电脑族用眼过度最伤眼!专家教你如何缓解视疲劳
  18. 我的python学习(前言 初生牛犊不怕虎)
  19. 5-大数据分析之 druid 介绍
  20. 计算机网络-数据交换技术

热门文章

  1. 企业微信三方应用服务商获取通讯录及扫码登录(测试应用)
  2. 如何给网页添加icon图标?
  3. 只允许输入数字,英文字母,符号(密码)
  4. 【TensorFlow】【数字货币】【单词记忆】【微信运营】【DIY电脑】 | Chat · 预告
  5. ysoserial exploit/JRMPClient
  6. windows应用商店打不开,错误代码0x80131500
  7. C#与VC相互调用之C#调用VC的DLL
  8. [Linux] 非root安装Lefse软件及其数据分析
  9. VB.NET 保留2位小数
  10. 计算机5级什么水平考试,怎么选择2015计算机等级考试级别