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
作 者:fengbohello
个人网站:http://www.fengbohello.top/
E-mail : fengbohello@foxmail.com
欢迎转载,转载请注明作者和出处。
因作者水平有限,不免出现遗漏和错误。希望热心的同学能够帮我指出来,我会尽快修改。愿大家共同进步,阿里嘎多~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?