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 ...
随机推荐
- pscp工具上传或取回文件、文件夹
1.把服务器上的/root/dir目录取回本地"C:\My Documents\data\"目录 C:\>pscp.exe -r root@IP:/root/dir &quo ...
- 无刷新读取数据库 (ajax)
<html> <head> <script type="text/javascript"> function loadXMLDoc() { va ...
- Linux设备树语法详解
概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写.引入了设备树之后,驱动代 ...
- java简单模拟生产者消费者问题
本文来自:http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言 生产者和消费者问题是线程模型中的经典问题:生产者和 ...
- 异步方法的意义何在,Async和await以及Task的爱恨情仇,还有多线程那一家子。
前两天刚感受了下泛型接口的in和out,昨天就开始感受神奇的异步方法Async/await,当然顺路也看了眼多线程那几个.其实多线程异步相关的类单个用法和理解都不算困难,但是异步方法Async/awa ...
- Java并发基础总结
并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力.如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可 交互性将大大改善.现代的PC都有多个CPU或一个CPU中有多 ...
- Spring mvc
1... . 2.spring 的结构图 3.spring mvc 架构 4.Spring mvc 的请求流程 . 文字讲解: request-------->DispatcherServler ...
- [LeetCode] Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树
Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- ASP.NET MVC Form验证
一.前言 关于表单验证,园子里已经有不少的文章,相信Web开发人员也都基本写过,最近在一个个人项目中刚好用到,在这里与大家分享一下.本来想从用户注册开始写起,但发现东西比较多,涉及到界面.前端验证.前 ...
- 值得注意的IsHitTestVisible
这个属性我们平时可能并不怎么用.先来看下MSDN上的解释: 解释的非常专业,然而我并没有看懂. 说说我的理解吧:把这个属性设置为false,看起来没有变化,但操作上已经把他完全忽视了,不触发事件,可以 ...