C语言创建及解析Json的使用法则
参考原文:http://blog.csdn.net/xukai871105/article/details/33013455
JSON(JavaScriptObject Notation)是一种轻量级的数据交换格式。它基于JavaScript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。
cJSON结构体:
typedefstruct cJSON {
structcJSON *next,*prev;
struct cJSON *child;
int type;
char * valuestring;
int valueint;
double valuedouble;
char *string;
}cJSON;
几点说明
- void create_single_number(void) {
- cJSON *root;
- char *out;
- int value = 24;
- root = cJSON_CreateObject(); // 创建根
- cJSON_AddItemToObject(root, "value", cJSON_CreateNumber(value));
- // 打印并释放
- out = cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out);
- // 控制台输出
- #if 0
- {
- "value": 24
- }
- #endif
- }
- void create_single_string(void) {
- cJSON *root;
- char *out;
- char *name = "xukai871105";
- root = cJSON_CreateObject(); // 创建根
- // 方法 使用cJSON_AddItemToObject,推荐使用
- cJSON_AddItemToObject(root, "name", cJSON_CreateString(name));
- // 打印并释放
- out = cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out);
- // 控制台输出
- #if 0
- {
- "name": "xukai871105"
- }
- #endif
- }
- void create_bool(void) {
- cJSON *root;
- char *out;
- root = cJSON_CreateObject(); // 创建根
- cJSON_AddItemToObject(root, "success", cJSON_CreateFalse());
- // 打印并释放
- out = cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out);
- // 控制台输出
- #if 0
- {
- "success": false
- }
- #endif
- }
- void create_simple(void) {
- cJSON *root;
- char *out;
- int list[4] = {5,6,7,8};
- root = cJSON_CreateObject(); // 创建根
- cJSON_AddItemToObject(root, "lists", cJSON_CreateIntArray(list, 4));
- // 打印并释放
- out = cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out);
- // 控制台输出
- #if 0
- {
- "lists": [5, 6, 7, 8]
- }
- #endif
- }
- void create_complex(void) {
- cJSON *root, *rows, *row;
- char *out;
- int i = 0;
- char *title[3] = { "树莓派学习笔记——索引博文",
- "树莓派学习笔记——GPIO功能学习",
- "物联网学习笔记——索引博文"};
- char *url[3] = { "http://blog.csdn.net/xukai871105/article/details/23115627",
- "http://blog.csdn.net/xukai871105/article/details/12684617",
- "http://blog.csdn.net/xukai871105/article/details/23366187"};
- root = cJSON_CreateObject(); // 创建根
- cJSON_AddNumberToObject(root, "total", 3);
- // 在object中加入array
- cJSON_AddItemToObject(root, "rows", rows = cJSON_CreateArray());
- for(i = 0; i < 3; i++) {
- // 在array中加入object
- cJSON_AddItemToArray(rows, row = cJSON_CreateObject());
- cJSON_AddItemToObject(row, "title", cJSON_CreateString(title[i]));
- cJSON_AddItemToObject(row, "url", cJSON_CreateString(url[i]));
- }
- // 打印并释放
- out = cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out);
- // 控制台输出
- #if 0
- {
- "total": 3,
- "rows": [{
- "title": "树莓派学习笔记——索引博文",
- "url": "http://blog.csdn.net/xukai871105/article/details/23115627"
- }, {
- "title": "树莓派学习笔记——GPIO功能学习",
- "url": "http://blog.csdn.net/xukai871105/article/details/12684617"
- }, {
- "title": "物联网学习笔记——索引博文",
- "url": "http://blog.csdn.net/xukai871105/article/details/23366187"
- }]
- }
- #endif
- }
参考上面的使用进行如下运用举例:
void PageListResponse()
{
cJSON * pJsonRoot = NULL;
cJSON * nameList = cJSON_CreateArray();
int i=;
cJSON *pJsonSub=NULL; pJsonRoot = cJSON_CreateObject(); if(NULL == pJsonRoot)
{
//error happend here
return ;
} if(NULL == nameList)
{
// create object faild, exit
printf("create json array faild\n");
return ;
} cJSON_AddStringToObject(pJsonRoot, "cmd", "PageListRes");
cJSON_AddItemToObject(pJsonRoot, "params", nameList); if(gPlayInfo.listinfo.audioInputSource==WIFI)
{
for(i=;i<LISTNAMENUMMAX;i++)
{ cJSON_AddItemToArray(nameList,pJsonSub= cJSON_CreateObject());
//cJSON_AddStringToObject(pJsonSub, "name",(gPlayInfo.listbuf+i)->name); //实验这种方式也OK,相对而言更简便!
//cJSON_AddStringToObject(pJsonSub, "singer",(gPlayInfo.listbuf+i)->singer);
cJSON_AddItemToObject(pJsonSub, "name", cJSON_CreateString((gPlayInfo.listbuf+i)->name));
cJSON_AddItemToObject(pJsonSub, "singer", cJSON_CreateString((gPlayInfo.listbuf+i)->singer));
}
}
else if(gPlayInfo.listinfo.audioInputSource==USB || gPlayInfo.listinfo.audioInputSource==SD)
{
for(i=;i<LISTNAMENUMMAX;i++)
{
//pJsonSub = cJSON_CreateObject();
cJSON_AddItemToArray(nameList,pJsonSub = cJSON_CreateObject());
//cJSON_AddStringToObject(pJsonSub, "name", paginglistname[i]); //这种方式也相当下面的实现,也OK
//cJSON_AddStringToObject(pJsonSub, "singer",“NULL”); //注意为"NULL" cJSON_AddItemToObject(pJsonSub, "name", cJSON_CreateString(paginglistname[i]));
cJSON_AddItemToObject(pJsonSub, "singer", cJSON_CreateString("NULL")); //注意空字串为“NULL”,而不是NULL,开始调试的时候,写入NULL,则出现EPC。 }
} char * p = cJSON_Print(pJsonRoot); // 将Json数组转成字符串指针,会产生内存,注意用free释放内存; if(NULL == p)
{
cJSON_Delete(pJsonRoot);
return;
} mosquitto_pub_start(p); cJSON_Delete(pJsonRoot); //不管创建了多少层,不需要一个一个进行删除,用cJSON_Delete删除根节点就ok
free(p); return ;
}
输出结果如下格式:
{
"cmd":"PageListRes",
"params":
[
{"name":"",”singer”:””},
{"name":"",”singer”:””},
{"name":"",”singer”:””},
......
{"name":"",”singer”:””},
]
}
========================================================================================
解析Json:
如下例子:
{
"cmd": "play",
"params": {
"listID": "abcdefg", //32位md5值
"playIndex":0 //播放索引
"songList":
[{
"id": "111",
"name": "what name",
"uri": "http://www.xxx.com",
"img": "http://www.xxx.com/yyy.jpg",
"singer": "singerName",
"album": "title11"
},
{
"id": "222",
"name": "what name",
"uri": "http://www.xxx.com",
"img": "http://www.xxx.com/yyy.jpg",
"singer": "singerName",
"album": "title22"
}]
},
}
该json数据指针通过message->payload传递,
cJSON* cmd;
char* cmd_out; cJSON* id;
char* id_out; cJSON* name;
char* name_out; cJSON* singer;
char* singer_out; cJSON* param; cJSON* songList; int songNum; cJSON* pArray_root = cJSON_Parse((char*)message->payload);//解析根节点 cmd = cJSON_GetObjectItem(pArray_root,"cmd"); param = cJSON_GetObjectItem(pArray_root,"params"); playIndex = cJSON_GetObjectItem(param,"playIndex")->valueint; songList = cJSON_GetObjectItem(param,"songList"); songNum=cJSON_GetArraySize(songList); int j=0;
for(j=0;j<songNum;j++)
{
pArray = cJSON_GetArrayItem(songList, j);
name = cJSON_GetObjectItem(pArray,"name");
uri = cJSON_GetObjectItem(pArray,"uri");
id = cJSON_GetObjectItem(pArray,"id");
singer= cJSON_GetObjectItem(pArray,"singer"); name_out = cJSON_Print(name);
uri_out = cJSON_Print(uri);
id_out = cJSON_Print(id);
singer_out = cJSON_Print(singer); ....... free(name_out);
free(uri_out);
free(id_out);
free(singer_out); }
C语言创建及解析Json的使用法则的更多相关文章
- Java创建和解析Json数据方法(三)——json-lib包的使用
(三)json-lib包的使用 这篇笔记主要介绍json-lib包的创建和解析json数据的方式,主要是的JSONObject.JSONArray和Java对象:beans, maps ...
- Unity3D_(数据)LitJson创建和解析Json
LitJson github: 传送门 JsonUtility创建和解析Json 传送门 LitJson.dll百度云盘 传送门 密码:p1py 加载LitJson.dll到Unity中 在Asset ...
- Unity3D_(数据)JsonUtility创建和解析Json
Json 百度百科:传送门 LitJson创建和解析Json 传送门 Json数据解析在Unity3d中的应用 传送门 一.使用JsonUnity创建Json using System.Collect ...
- iOS 使用SBJSON创建和解析JSON
原文地址:http://blog.csdn.net/gf771115/article/details/7718403 //创建JSON NSDictionary *dictonary = [[NSMu ...
- Java创建和解析Json数据方法(四)——json-lib包的使用
(四)json-lib包的使用 既然json-lib包比org.json包重量级,那么json-lib包肯定有很多org.json包没有的类和方法,这篇笔记简单记录json-lib包中 ...
- Java创建和解析Json数据方法(二)——org.json包的使用
(二)org.json包的使用 1.简介 工具包org.json.jar,是一个轻量级的,JAVA下的json构造和解析工具包,它还包含JSON与XML, HTTP headers, Cookie ...
- Java创建和解析Json数据方法——org.json包的使用(转)
org.json包的使用 1.简介 工具包org.json.jar,是一个轻量级的,JAVA下的json构造和解析工具包,它还包含JSON与XML, HTTP headers, Cookies, ...
- Java创建和解析Json数据方法(五)——Google Gson包的使用
(五)Google Gson包的使用 1.简介 Gson包中,使用最多的是Gson类的toJson()和fromJson()方法: ①toJson():将java对象转化为json数据 ...
- Groovy创建和解析json
正文: 在Groovy 1.8发布新闻中,提到Groovy增加了对JSON的支持.Dustin Marx在其博文中,讲述了这一功能的使用. 用法真的很简单,创建一个JSON对象: import gr ...
随机推荐
- iOS系列 基础篇 05 视图鼻祖 - UIView
iOS系列 基础篇 05 视图鼻祖 - UIView 目录: UIView“家族” 应用界面的构建层次 视图分类 最后 在Cocoa和Cocoa Touch框架中,“根”类时NSObject类.同样, ...
- Oracle Partition Outer Join 稠化报表
partition outer join实现将稀疏数据转为稠密数据,举例: with t as (select deptno, job, sum(sal) sum_sal from emp group ...
- Jsoup系列学习(1)-发送get或post请求
简介 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据. 官 ...
- Pwn~
Pwn Collections Date from 2016-07-11 Difficult rank: $ -> $$... easy -> hard CISCN 2016 pwn-1 ...
- 安全测试 - XSS如何防御
XSS主要是通过劫持用户COOKIE,执行JS脚本进行攻击 如何发现: 可以使用<script>alert(/yourname/)</script> script最具有代表性也 ...
- mysql 文件导入方法总结
数据导入3三种方法 一.phpMyAdmin 限制大小:2M 1.创建数据库 2.导入.sql或.sql.zip文件 大数据导入方法一:http://jingyan.baidu.com/article ...
- docker常用命令
yum install wget -y wget -O etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7 ...
- [LeetCode] Decode String 解码字符串
Given an encoded string, return it's decoded string. The encoding rule is: k[encoded_string], where ...
- [LeetCode] Strobogrammatic Number II 对称数之二
A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...
- 【WPF】最近在学习wpf 的绑定,,
最近在学习wpf 的绑定,,1.简单的说就是版前端和后端用自己的方法给分开了2.baseVm 模型 baseCmd 命令3.命令传参修改的只是界面里的属性,而不修改其它的值4.前端改变后端, 后端改变 ...