CJSON 使用介绍
首先,要介绍一下什么是json格式。
一.JSON格式简述
gcc *.c cJSON.c -lm
记得编译时末尾链接libm库。
- typedef struct cJSON {
- struct cJSON *next,*prev;
- struct cJSON *child;
- int type;
- char *valuestring;
- int valueint;
- double valuedouble;
- char * string;
- } cJSON;
几点说明
cJSON作为Json格式的解析库,其主要功能无非就是构建和解析Json格式了,用途就是一端将要发送的数据已cjson形式封装,然后发送,另一端收到此数据后,还是按cjson形式解析,就得到想要的数据了。
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include"cJSON.h"
- int main()
- {
- cJSON * usr;
- cJSON *arry;
- usr=cJSON_CreateObject(); //创建根数据对象
- cJSON_AddStringToObject(usr, "name", "fengxin"); //加入键值,加字符串
- cJSON_AddStringToObject(usr, "passwd", "123");
- cJSON_AddNumberToObject(usr, "num", 1); //加整数
- char *out = cJSON_Print(usr); //将json形式打印成正常字符串形式
- printf( "%s\n",out);
- // 释放内存
- cJSON_Delete(usr);
- free(out);
- }
运行结果:
- {
- "name": "fengxin",
- "passwd": "123",
- "num": 1
- }
若干说明
- int create_js(void)
- {
- cJSON *root, *js_body;
- root = cJSON_CreateArray();
- cJSON_AddItemToArray(root, cJSON_CreateString( "Hello world"));
- cJSON_AddItemToArray(root, cJSON_CreateNumber( 10));
- {
- // char *s = cJSON_Print(root);
- char *s = cJSON_PrintUnformatted(root);
- if(s){
- printf( " %s \n",s);
- free(s);
- }
- }
- if(root)
- cJSON_Delete(root);
- return 0;
- }
- int main(int argc, char **argv)
- {
- create_js();
- return 0;
- }
["Hello world",10]
<3> 对象里面包括一个数组,数组里面包括对象,对象里面再添加一个字符串和一个数字:
- int create_js(void)
- {
- cJSON *root, *js_body, *js_list;
- root = cJSON_CreateObject();
- cJSON_AddItemToObject(root, "body", js_body = cJSON_CreateArray());
- cJSON_AddItemToArray(js_body, js_list = cJSON_CreateObject());
- cJSON_AddStringToObject(js_list, "name", "fengxin");
- cJSON_AddNumberToObject(js_list, "status", 100);
- {
- // char *s = cJSON_Print(root);
- char *s = cJSON_PrintUnformatted(root);
- if(s){
- printf( " %s \n",s);
- free(s);
- }
- }
- if(root)
- cJSON_Delete(root);
- return 0;
- }
- int main(int argc, char **argv)
- {
- create_js();
- return 0;
- }
{"body":[{"name":"fengxin","status":100}]}
<4>其他组合就依次类推,只要搞清楚父子关系即可。随便嵌套随便玩。不再贴了。
处理流程:
1, 先将普通的json串处理成json对象,也就是所谓的创建json root的过程,只有一行代码即可:
- cJSON *root;
- root = cJSON_Parse(js_string);
2,开始拿关键字,但如果关键字还有父层或者祖层,那就需要先从父层开拿,所谓剥洋葱是也!
先说没有父层的:
out={\"name\":\"fengxin\",\"passwd\":\"123\",\"num\":1}
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include"cJSON.h"
- int main()
- {
- cJSON *json,*json_name,*json_passwd,*json_num;
- char* out= "{\"name\":\"fengxin\",\"passwd\":\"123\",\"num\":1}";
- json = cJSON_Parse(out); //解析成json形式
- json_name = cJSON_GetObjectItem( json , "name" ); //获取键值内容
- json_passwd = cJSON_GetObjectItem( json , "passwd" );
- json_num = cJSON_GetObjectItem( json , "num" );
- printf( "name:%s,passwd:%s,num:%d\n",json_name->valuestring,json_passwd->valuestring,json_num->valueint);
- cJSON_Delete(json); //释放内存
- free(out);
- }
显示结果:
name:fengxin,passwd:123,num:1
需要注意的是: 上面的type 已经在cJSON.h里面定义好了,有自己的意义。如果是在严格的场所,应该先判定该 item的type,然后再考虑去拿值。
而如果有父层的话,无非就是接着向下拿就是了
3. 处理这串数据:
out={\"list\":{\"name\":\"xiao hong\",\"age\":10},\"other\":{\"name\":\"hua hua\"}}
- char *s = "{\"list\":{\"name\":\"xiao hong\",\"age\":10},\"other\":{\"name\":\"hua hua\"}}";
- cJSON *root = cJSON_Parse(s);
- if(!root) {
- printf( "get root faild !\n");
- return -1;
- }
- cJSON *js_list = cJSON_GetObjectItem(root, "list");
- if(!js_list) {
- printf( "no list!\n");
- return -1;
- }
- printf( "list type is %d\n",js_list->type);
- cJSON *name = cJSON_GetObjectItem(js_list, "name");
- if(!name) {
- printf( "No name !\n");
- return -1;
- }
- printf( "name type is %d\n",name->type);
- printf( "name is %s\n",name->valuestring);
- cJSON *age = cJSON_GetObjectItem(js_list, "age");
- if(!age) {
- printf( "no age!\n");
- return -1;
- }
- printf( "age type is %d\n", age->type);
- printf( "age is %d\n",age->valueint);
- cJSON *js_other = cJSON_GetObjectItem(root, "other");
- if(!js_other) {
- printf( "no list!\n");
- return -1;
- }
- printf( "list type is %d\n",js_other->type);
- cJSON *js_name = cJSON_GetObjectItem(js_other, "name");
- if(!js_name) {
- printf( "No name !\n");
- return -1;
- }
- printf( "name type is %d\n",js_name->type);
- printf( "name is %s\n",js_name->valuestring);
- if(root)
- cJSON_Delete(root);
- return 0;
打印结果:
- list type is 6
- name type is 4
- name is xiao hong
- age type is 3
- age is 10
- list type is 6
- name type is 4
- name is hua hua
{\"list\":[\"name1\",\"name2\"]}
- int main(int argc, char **argv)
- {
- char *s = "{\"list\":[\"name1\",\"name2\"]}";
- cJSON *root = cJSON_Parse(s);
- if(!root) {
- printf( "get root faild !\n");
- return -1;
- }
- cJSON *js_list = cJSON_GetObjectItem(root, "list");
- if(!js_list){
- printf( "no list!\n");
- return -1;
- }
- int array_size = cJSON_GetArraySize(js_list);
- printf( "array size is %d\n",array_size);
- int i = 0;
- cJSON *item;
- for(i= 0; i< array_size; i++) {
- item = cJSON_GetArrayItem(js_list, i);
- printf( "item type is %d\n",item->type);
- printf( "%s\n",item->valuestring);
- }
- if(root)
- cJSON_Delete(root);
- return 0;
- }
5. 如果json数组里面又搞了对象怎么办?
不怕搞对象,就怕这样搞对象? 无他,就是稍微复杂了一点,全是体力活儿:
<1> 既然是数组里面,那肯定要先测量数组的大小,然后根据大小循环拿;
<2> 拿到一个数组项,然后把这个项先转化成普通的json字符串,也就是 char *s 能接受的。
<3>再次将这个json字符串,转化成一个json对象
<4> 按照拿普通对象中的东西那样开干就行了。
{\"list\":[{\"name\":\"xiao hong\",\"age\":10},{\"name\":\"hua hua\",\"age\":11}]}
list 是一个数组,数组里面有两个对象,那么代码如下
- int main(int argc, char **argv)
- {
- char *s = "{\"list\":[{\"name\":\"xiao hong\",\"age\":10},{\"name\":\"hua hua\",\"age\":11}]}";
- cJSON *root = cJSON_Parse(s);
- if(!root) {
- printf( "get root faild !\n");
- return -1;
- }
- cJSON *js_list = cJSON_GetObjectItem(root, "list");
- if(!js_list){
- printf( "no list!\n");
- return -1;
- }
- int array_size = cJSON_GetArraySize(js_list);
- printf( "array size is %d\n",array_size);
- int i = 0;
- cJSON *item,*it, *js_name, *js_age;
- char *p = NULL;
- for(i= 0; i< array_size; i++) {
- item = cJSON_GetArrayItem(js_list, i);
- if(!item) {
- //TODO...
- }
- p = cJSON_PrintUnformatted(item);
- it = cJSON_Parse(p);
- if(!it)
- continue ;
- js_name = cJSON_GetObjectItem(it, "name");
- printf( "name is %s\n",js_name->valuestring);
- js_age = cJSON_GetObjectItem(it, "age");
- printf( "age is %d\n",js_age->valueint);
- }
- if(root)
- cJSON_Delete(root);
- return 0;
- }
CJSON 使用介绍相关推荐
- CJSON的介绍以及使用
一.JSON概述 1.1 JSON介绍 JSON:JavaScript对象表示法(JavaScript Object Notation).是一种轻量级的数据交换格式.它基于ECMAScript的一个子 ...
- cJSON库用法详解
cJSON库用法详解_宁静致远2021的博客-CSDN博客_cjson cJSON库用法详解 问题和需要注意的地方 一.JSON.cJSON简介 1. JSON 简介 2. JSON 语法 3. 开源 ...
- 【C】cJSON使用以及在stm32中的应用
1. cJSON使用 最近一段时间在整理自己进入研究生阶段后学习过程中的一些内容,之前在进行相关代码调试过程中,也的确耗费了比较大的精力去搜寻资料,然后整合代码到自己所需要的系统中,如在stm32中使 ...
- c语言组json包,json格式解析和libjson的用法介绍(关于cjson的使用方法)
在阅读本文之前,请先阅读下<Rss Reader实例开发之系统设计>一文. Rss Reader实例开发中,进行网络数据交换时主要使用到了两种数据格式:JSON与XML.本文主要介绍JSO ...
- cjson源代码解读 (一)介绍
cjson是一个非常小巧的c语言写的json解析器, 代码比较短小精悍, c文件不过千行, 同类代码可在网页 json库 中找到. 项目地址如下: cjson地址 json的格式就不介绍了, 下 ...
- cJSON介绍及使用
JSON(JavaScript Object Notation)是一种轻量级的文本数据交换格式,易于让人阅读.同时也易于机器解析和生成.尽管JSON是Javascript的一个子集,但JSON是独立于 ...
- 第三方库介绍——cJSON库
文章目录 综述 API cJSON结构体 数据的封装 Json 对象操作 Json 数组操作 序列化 Json 字符串的解析 内存释放 Json 数据的封装 Json 对象操作举例 Json 数组操作 ...
- Openresty最佳案例 | 第8篇:RBAC介绍、sql和redis模块工具类
RBAC介绍 RBAC(Role-Based Access Control,基于角色的访问控制),用户基于角色的访问权限控制.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成&q ...
- libevent和libcurl实现http和https服务器 cJSON使用
前言 libevent和libcurl都是功能强大的开源库:libevent主要实现服务器,包含了select.epoll等高并发的实现:libcurl实现了curl命令的API封装,主要作为客户端. ...
最新文章
- POJ1422 最小路径覆盖
- 什么技术能改变世界?
- 资讯类产品的数据驱动增长方法论
- linux文件的打包与下载总结,linux下文件的打包和压缩
- BOMHEAD display issue
- ibatis mysql 同时删多个表报错_MySQL中Multiple primary key defined报错的解决办法
- 太长的sql怎么分析_因为ESR, 我一定要推荐你这款 SQL 神器
- 2063:【例1.4】牛吃牧草【入门题】
- 在用户空间加载和卸载驱动
- 用VMWARE学习组网(二)
- 邮件服务器向hotmail等邮箱发信收到退信的解决方法
- 【使用工具和软件汇总】
- C#Json数据交互
- matlab 生成噪声信号
- 超强Commodore C64 emulator for Flash Player 9
- QT将英文星期转为中文星期
- 解决git Please use -- (and optionally --no-guess) to disambiguate
- jQuery:等页面DOM加载完毕后再执行代码
- 《五种时间:重建人生秩序》读书笔记
- HTML5学习(二)---构造网页