cJSON库的简单介绍及使用
转载:http://www.cnblogs.com/liunianshiwei/p/6087596.html
JSON 语法是 JavaScript 对象表示法语法的子集。数据在键/值对中;数据由逗号分隔;花括号保存对象, 也称一个文档对象;方括号保存数组, 每个数组成员用逗号隔开, 并且每个数组成员可以是文档对象或者数组或者键值对 。
JSON基于两种结构:
“名称/值”对的集合(A collection of name/value pairs)。不同的编程语言中,它被理解为对象(object),纪录(record),结构(struct),字(dictionary),哈希表(hashtable),有键列表(keyed list),或者关联数组 (associative array)。
值的有序列表(An ordered list of values)。在大部分语言中,它被实现为数组(array),矢量(vector),列表(list),序列(sequence)。
JSON的三种语法:
键/值对 key:value,用半角冒号分割。 比如 "name":"Faye"
文档对象 JSON对象写在花括号中,可以包含多个键/值对。比如{ "name":"Faye" ,"address":"北京" }。
数组 JSON 数组在方括号中书写: 数组成员可以是对象,值,也可以是数组(只要有意义)。 {"love": ["乒乓球","高尔夫","斯诺克","羽毛球","LOL","撩妹"]}
附cJSON库下载地址 https://github.com/DaveGamble/cJSON
如何在自己的项目中使用cJSON库:
将cJSON.c(或者库文件) 和 cJSON.h添加到项目中即可;
C语言函数库写JSON文件 :
从缓冲区中解析出JSON结构:extern cJSON *cJSON_Parse(const char *value);
解析一块JSON数据返回cJSON结构, 在使用完之后调用cJSON_Delete函数释放json对象结构。
将传入的JSON结构转化为字符串 :extern char *cJSON_Print(cJSON *item);
可用于输出到输出设备, 使用完之后free(char *) 。
将JSON结构所占用的数据空间释放 :void cJSON_Delete(cJSON *c)
创建一个值类型的数据 :extern cJSON *cJSON_CreateNumber(double num);
extern cJSON *cJSON_CreateString(const char *string);
extern cJSON *cJSON_CreateArray(void);
创建一个对象(文档) :extern cJSON *cJSON_CreateObject(void);
数组创建以及添加 :cJSON *cJSON_CreateIntArray(const int *numbers,int count);
void cJSON_AddItemToArray(cJSON *array, cJSON *item);
JSON嵌套 :
【 向对象中增加键值对】 cJSON_AddItemToObject(root, "rows", 值类型数据相关函数());
【 向对象中增加数组】 cJSON_AddItemToObject(root, "rows", cJSON_CreateArray());
【 向数组中增加对象】 cJSON_AddItemToArray(rows, cJSON_CreateObject());
几个能提高操作效率的宏函数 :#define cJSON_AddNumberToObject(object,name,n) \
cJSON_AddItemToObject(object, name,cJSON_CreateNumber(n))
#define cJSON_AddStringToObject(object,name,s)\
cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
C语言库函数解析JSON文件 :
根据键找json结点 :extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string)
判断是否有key是string的项 如果有返回1 否则返回0 :
extern int cJSON_HasObjectItem(cJSON *object,const char *string)
{ return cJSON_GetObjectItem(object,string)?1:0; }
返回数组结点array中成员的个数 :extern int cJSON_GetArraySize(cJSON *array);
根据数组下标index取array数组结点的第index个成员 返回该成员节点 :extern cJSON *cJSON_GetArrayItem(cJSON *array,int index);
遍历数组 :#define cJSON_ArrayForEach(pos, head) for(pos = (head)->child; pos != NULL; pos = pos->next)
例子:
1.解析json
void CParsejson()
{
char* data = "{\"name\":\"Messi\",\"age\":\"29\"}";
//从缓冲区中解析json结构
cJSON* root = cJSON_Parse(data); if (data == NULL)
{
return;
} cJSON* itemName = cJSON_GetObjectItem(root, "name"); if (itemName)
{
cout << "name: "<< itemName->valuestring << endl;
} cJSON* itemAge = cJSON_GetObjectItem(root, "age");
if (itemAge)
{
cout << "age: " << itemAge->valuestring << endl;
}
//讲json结构占用的数据空间释放
cJSON_Delete(root);
} int main()
{
CjsonTest1();
return ;
}
运行结果:

2.讲json数据写入文件
void WriteJson()
{
char *char_json = "{\"hello\":\"你好\"}"; //从缓冲区中解析出JSON结构
cJSON *json = cJSON_Parse(char_json); if (json == NULL)
{
return;
} //将传入的JSON结构转化为字符串
char *buf = NULL;
buf = cJSON_Print(json); //打开一个info.json文件,并写入json内容
FILE *fp = fopen("info.json", "w");
fwrite(buf, strlen(buf), , fp); fclose(fp);//关闭文件
free(buf);//释放资源
cJSON_Delete(json);//释放资源
} int main()
{
WriteJson();
return ;
}
文件内容:

3.代码生成json
cJSON库的简单介绍及使用的更多相关文章
- app 下载更新 file-downloader 文件下载库的简单介绍和使用
app 下载更新 file-downloader 文件下载库的简单介绍和使用 今天介绍一个下载库:file-downloader 文件下载库 说明: * 本文内容来自原 file-downloader ...
- 嵌入式 Linux下curl库API简单介绍
1:CURLcode curl_global_init(long flags); 这个函数全局需要调用一次(多次调用也可以,不过没有必要), 所以这也是把Curlplus设计成单体类的原因,curl_ ...
- python第三方库requests简单介绍
一.发送请求与传递参数 简单demo: import requests r = requests.get(url='http://www.itwhy.org') # 最基本的GET请求 print(r ...
- JSON的简单介绍以及C语言的JSON库使用
JSON概述 JSON: JavaScript 对象表示法( JavaScript Object Notation) .是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON采 ...
- FreeSWITCH第三方库(其他)的简单介绍(三)
FreeSWITCH使用了大量的第三方库,本文档主要介绍关联相关库的信息: 音频相关库的信息介绍参考:http://www.cnblogs.com/yoyotl/p/5486753.html 视频相关 ...
- GitHub开源库排名一百的简单介绍,值得收藏!
GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub ...
- 嵌入式Linux下MP4视频录制库MP4V2移植和简单介绍
**************************************************************************************************** ...
- 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍
GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...
- professional cuda c programming--CUDA库简单介绍
CUDA Libraries简单介绍 上图是CUDA 库的位置.本文简要介绍cuSPARSE.cuBLAS.cuFFT和cuRAND.之后会介绍OpenACC. cuSPARSE线性代数库,主要针 ...
随机推荐
- IE8 CSS hack
IE8正式版出来有一段日子了,但是针对ie8正式版的CSS hack却很少,其实这是值得庆幸的,因为ie8修复了很多IE6和IE7的一些BUG,更加接近W3C标准. 针对IE8正式版的CSS hack ...
- db2修改表结构,增加列,删除列等
增加一列:ALTER TABLE tbname ADD COLUMN columnName datatype; 增加多列:ALTER TABLE tbname ADD COLUMN columnNam ...
- jQuery属性--addClass()和removeClass()
addClass(class|fn) 概述 为每个匹配的元素添加指定的类名 参数 class 一个或多个要添加到元素中的CSS类名,请用空格分开: function(index, class) ...
- SQL中的 group by 1, order by 1 语句
看到group by 1,2 和 order by 1, 2.看不懂,google,搜到了Stack Overflow 上有回答 What does SQL clause “GROUP BY 1” m ...
- 【转】求职面试-HR会问你什么问题?
前言 面试是程序员们经常探讨的话题,只要你通过前面的技术面,最后一面必然是HR面试,基本上到了这关你离Offer的距离应该不会太远了,但有的公司的HR是有刷入的权利,如果你并不能很好的应对HR的问题, ...
- python中函数嵌套、函数作为变量以及闭包的原理
嵌套函数: python允许创建嵌套函数.也就是说我们可以在函数里面定义函数,而且现有的作用域和变量生存周期依旧不变. 例子: #encoding=utf-8 def outer(): name ...
- vuejs-devtools浏览器调试chrome插件
vuejs-devtools浏览器调试chrome插件(360极速浏览器也可以安装,需要FQ)https://chrome.google.com/webstore/detail/vuejs-devto ...
- php 当前时间 当前时间戳和数据库里取出的时间datetime格式进行比较大小
php 当前时间 当前时间戳和数据库里取出的时间datetime格式进行比较大小 UNIX时间戳转换为日期用函数: date() ,date('Y-m-d H:i:s', 1500219870); 日 ...
- 图像处理基础---RGB图 灰度图 索引图 调色板
(1)二进制图 在二进制图中,像素的取值为两个离散数值0或1中的一个,0代表黑色,1代表白色 例 A=[0 0 1;1 1 0; 0 0 1];>> imshow(A,'InitialMa ...
- JavaUtil smtp 邮件发送
需要用到的jar包:javax.mail.jar package com.lee.util; import java.io.UnsupportedEncodingException; import j ...