cJSON应用举例
//在网上查了不少cJSON,结果只找到c语言字符串转换到JSON的实例,想转回来结果没有实例。自己琢磨了一个下午才敢下手。下面把转来转去的代码贴上。
//百度网盘的 CJSON 实例源码 地址 http://pan.baidu.com/s/1ntsRLgt
/*******************************************
*先C转成JSON的字符串,然后再把这个JSON的字符串转回来。
*******************************************/
#include "stdio.h"
#include "cjson.h"
/*******************************
* 建一个工程把"cjson.c"也加进去。
* 要是不想建工程,那就把下面这个注释去掉。
* 虽然正常人不这么干,但图个方便,也不管那么多了。
*******************************/
//#include "cjson.c"
int main_()
{
//首先是用C转换成JSON
char *out ;
cJSON *root,*fmt;
root=cJSON_CreateObject();//创建项目
cJSON_AddItemToObject(root, "name", cJSON_CreateString("Jack (\"Bee\") Nimble"));
cJSON_AddItemToObject(root, "format", fmt=cJSON_CreateObject());//在项目上添加项目
cJSON_AddStringToObject(fmt,"type", "rect");//在项目上的项目上添加字符串,这说明cJSON是可以嵌套的
cJSON_AddNumberToObject(fmt,"width", 1920);
cJSON_AddNumberToObject(fmt,"height", 1080);
cJSON_AddNumberToObject(fmt,"frame rate", 24);
out=cJSON_Print(fmt);
printf("%s\n",out);//此时out指向的字符串就是JSON格式的了
free(out);//释放空间
//接下来进行JSON格式向回转换
cJSON *fmt = NULL,*JSONroot = NULL;
num = cJSON_GetArraySize(JSONroot);//看看有多少个项目
fmt = cJSON_GetObjectItem(JSONroot,"name");
char name[256];
snprintf(name,256,"%s",fmt->valuestring);//把fmt指向的JSON节点的字符串复制到name数组里来。
//JSON是采用链式存储的,就是链表存储。具体的结构体可以在"cjson.h"里面找到
/* The cJSON structure: */
//typedef struct cJSON {
// struct cJSON *next,*prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
// struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
// int type; /* The type of the item, as above. */
// char *valuestring; /* The item's string, if type==cJSON_String */
// int valueint; /* The item's number, if type==cJSON_Number */
// double valuedouble; /* The item's number, if type==cJSON_Number */
// char *string; /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
//} cJSON;
cJSON *child;
fmt = cJSON_GetObjectItem(JSONroot,"format");
child = cJSON_GetObjectItem(fmt,"type");
char type[256];
snprintf(type,256,"%s",child->valuestring);
child = cJSON_GetObjectItem(fmt,"width");
int width = child->valueint;
child = cJSON_GetObjectItem(fmt,"height");
int heigh = child->valueint;
child = cJSON_GetObjectItem(fmt,"frame rate");
int frame = child->valueint;
return 0;
}
补充一篇CJSON实例(创建和解析json对象、创建和解析json数组)《使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解》
不过使用cJSON的时候要注意,不要忘了用cJSON_Delete()释放JSON的内存,和用free()释放cJSON_Print()或者cJSON_PrintUnformatted()返回的内存,否则会造成内存混乱。
如果不想纠结内存管理方面的问题,可以考虑使用jsoncpp,这样就可以不去考虑内存的释放了
jsoncpp http://www.cnblogs.com/fengbohello/p/4059435.html
或 http://www.cnblogs.com/fengbohello/p/4066254.html
作者:郝峰波
mail : fengbohello@qq.com
cJSON应用举例的更多相关文章
- 【转】cJSON 源码分析
cJSON源码分析 简介 由于C语言汇总,没有直接的字典,字符串数组等数据结构,所以要借助结构体定义,处理json. JSON是一种轻量级的数据交换格式.JSON采用完全独立与语言的文本格式,易于人阅 ...
- Ajax 概念 分析 举例
Ajax是结合了访问数据库,数据访问,Jquery 可以做页面局部刷新或者说是页面不刷新,我可以让页面不刷新,仅仅是数据的刷新,没有频繁的刷页面,是现在比较常用的一种方式做页面那么它是怎么实现页面无刷 ...
- ValueInjecter----最好用的OOM(以微信消息转对象举例)
使用数据实体的好处我这里就不多说了,但大家享受这些好处的时候,难免也对那些琐碎的赋值代码感到厌烦,基于此,我认为掌握一个oom的使用,还是很有必要的. 这种类型的工具有很多,比如automapper, ...
- Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)
<Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...
- Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)
<Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...
- shell-script的简单举例
#!/bin/bash #defind the path PATH=/usr/local export PATH read -p "please input your first name: ...
- 各大浏览器内核特性及对应的Browserhacks举例
1.浏览器内核指的是什么? 简化的浏览器=用户界面+渲染引擎+js解析引擎+数据存储+网络部件 而通常所说的浏览器内核指的是页面渲染引擎(rendering engine). 2.渲染引擎 The r ...
- js调用php和php调用js的方法举例
js调用php和php调用js的方法举例1 JS方式调用PHP文件并取得php中的值 举一个简单的例子来说明: 如在页面a.html中用下面这句调用: <script type="te ...
- c++局部变量经典举例
局部变量: 在函数内部声明的变量为局部变量,局部变量的意思即该变量只存活在该函数中,假如该函数调用结束,那么该变量的寿命也结束了. 举例: #include<iostream> using ...
随机推荐
- 查看Eclipse中的jar包的源代码:jd-gui.exe
前面搞了很久的使用JAD,各种下载插件,最后配置好了,还是不能用,不知道怎么回事, 想起一起用过的jd-gui.exe这个工具,是各种强大啊!!! 只需要把jar包直接扔进去就可以了,非常清晰,全部解 ...
- Java中必须了解的常用类
1.Java的包装类 基本数据类型我们都很熟悉,例如:int.float.double.boolean.char等,基本数据类型不具备对象的特征,不能调用方法,一般能实现的功能比较简单,为了让基本数据 ...
- 【python】一个简单的贪婪爬虫
这个爬虫的作用是,对于一个给定的url,查找页面里面所有的url连接并依次贪婪爬取 主要需要注意的地方: 1.lxml.html.iterlinks() 可以实现对页面所有url的查找 2.获取页面 ...
- [Android Studio] 使用本地 aar 文件
导出aar 首先Android Library项目的gradle脚本只需要在开头声明 apply plugin: 'com.android.library' 之后就和导出apk文件一样的方法,执行 . ...
- Catch That Cow(poj 3278)
给定两个整数n和k 通过 n+1或n-1 或n*2 这3种操作,使得n==k 输出最少的操作次数 //广搜,a是队列,step记录步数,vis记录哪些数被搜到过 #include<cstdio& ...
- Android之智能问答机器人
本文主要利用图灵机器人的接口,所做的一个简单的智能问答机器人 实现 由于发送与接收消息都是不同的listView,所以要用有两个listVeiw的布局文件 接收消息布局文件 <?xml vers ...
- 用java程序打印菱形
代码如下
- Maven使用笔记(五)Sonatype Nexus 搭建Maven 私服
1. 为什么使用Nexus 如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地, 而一个团队中的所有人都重复的从maven仓库下载构件无疑加大了仓库的负载 ...
- Redis快速入门:安装、配置和操作
本文是有关Redis的系列技术文章之一.在之前的文章中介绍了<Redis快速入门:初识Redis>,对Redis有了一个初步的了解.今天继续为大家介绍Redis如何安装.配置和操作. 系列 ...
- 更改Windows控制台默认缓冲区行数和宽度
Windows控制台窗口默认的显示行数很少, 以至于有时候要显示很多东西的时候, 总是导致前面的内容丢失. 很不爽. 于是GG了下, 在StackOverflow上找到了答案~~~ 设置方式: 1. ...