IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> cJSON的使用 -> 正文阅读

[开发工具]cJSON的使用

# 下载
代码存储在git上,地址:https://github.com/DaveGamble/cJSON.git

用下面的命令下载
```
git clone ?https://github.com/DaveGamble/cJSON.git
```

# 类型

```
#define cJSON_Invalid (0)
#define cJSON_False ?(1 << 0)
#define cJSON_True ? (1 << 1)
#define cJSON_NULL ? (1 << 2)
#define cJSON_Number (1 << 3)
#define cJSON_String (1 << 4)
#define cJSON_Array ?(1 << 5)
#define cJSON_Object (1 << 6)
#define cJSON_Raw ? ?(1 << 7) /* raw json */
```
共有7种json类型和一种非法类型

```
/* The cJSON structure: */
typedef struct cJSON
{
? ? /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
? ? struct cJSON *next;
? ? struct cJSON *prev;
? ? /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
? ? struct cJSON *child;

? ? /* The type of the item, as above. */
? ? int type;

? ? /* The item's string, if type==cJSON_String ?and type == cJSON_Raw */
? ? char *valuestring;
? ? /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
? ? int valueint;
? ? /* The item's number, if type==cJSON_Number */
? ? double valuedouble;

? ? /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
? ? char *string;
} cJSON;
```
首先,一个json结构包含三个指针:后一个节点,前一个节点和子json. 

然后一个整型变量存储json的类型,类型就是上边的那8种之1。  

当类型是cJSON_String和cJSON_Raw时,值存储在valuestring中,字符串指针类型。

极其不赞成写入整型,用cJSON_SetNumberValue替代。

当类型是cJSON_Number时,值存储在valuedouble中,类型为双精度浮点数。

键值对中键的名称保存在char *string中

```
typedef struct cJSON_Hooks
{
? ? ? /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */
? ? ? void *(CJSON_CDECL *malloc_fn)(size_t sz);
? ? ? void (CJSON_CDECL *free_fn)(void *ptr);
} cJSON_Hooks;
```

此结构体,保存动态申请内存和释放内存的函数指针,可自定义内存函数。

# 常用接口

## 解析json
接口 | 作用
---|---
cJSON_Parse | 字符串转json
cJSON_ParseWithLength | 将部分字符串转json
cJSON_Print | 格式化打印json,返回值char *
cJSON_PrintUnformatted | 非格式化打印json,返回值char*
cJSON_Delete | 删除json对象
cJSON_GetArraySize | 获取json对象数组成员个数
cJSON_GetArrayItem | 根据下标获取json对象
cJSON_GetObjectItem | 根据键获取值
cJSON_GetErrorPtr | 获取错误,返回值为字符串

例子 ?
使用时直接将cJSON.c与cJSON.h放入项目文件中即可
```
#include <stdio.h>
#include <cJSON.h>

int main()
{
? ? #include <stdio.h>
#include <cJSON.h>

int main()
{
? ? char *pJsonStr = "{\"num\":2,\"students\":[{\"name\":\"lilei\",\"age\":27,\"gender\":\"man\"},{\"name\":\"hanmeimei\",\"age\":25,\"gender\":\"woman\"}]}";
? ? cJSON *pJsonObj = NULL;
? ? cJSON *pJsonNUm = NULL;
? ? cJSON *pJsonStudents = NULL;
? ? cJSON *pJsonStudent = NULL;
? ? int iNum = 0;

? ? pJsonObj = cJSON_Parse(pJsonStr);
? ? if(!pJsonObj)
? ? {
? ? ? ? printf("error:[%s\n]",cJSON_GetErrorPtr());
? ? ? ? return -1;
? ? }

? ? //格式化打印
? ? printf("format print:\n%s\n",cJSON_Print(pJsonObj));

? ? //非格式化打印
? ? printf("unformat print:\n%s\n",cJSON_PrintUnformatted(pJsonObj));

? ? //解析int
? ? pJsonNUm = cJSON_GetObjectItem(pJsonObj,"num");
? ? //printf("%s is %lf\n",pJsonNUm->string,pJsonNUm->valuedouble);
? ? printf("%s is %d\n",pJsonNUm->string,pJsonNUm->valueint);//取整数部分
? ? //解析数组
? ? pJsonStudents = cJSON_GetObjectItem(pJsonObj,"students");
? ? iNum = cJSON_GetArraySize(pJsonStudents);
? ? for(int i = 0;i < iNum; i++)
? ? {
? ? ? ? pJsonStudent = cJSON_GetArrayItem(pJsonStudents,i);
? ? ? ? printf("%s \n",cJSON_PrintUnformatted(pJsonStudent));
? ? }

? ? //释放json
? ? cJSON_Delete(pJsonObj);
? ? return 0;
}
```

## 构造json
接口 | 作用
---|---
cJSON_CreateObject | 创建json结构
cJSON_AddItemToObject | 添加新的键值对
cJSON_AddItemToArray | 将json添加到数组
cJSON_CreateNull | 创建NULL类型的键值
cJSON_CreateTrue | 创建Ture类型的键值
cJSON_CreateFalse | 创建False类型的键值
cJSON_CreateBool | 创建BOOL类型的键值
cJSON_CreateNumber | 创建double类型的键值
cJSON_CreateString | 创建字符串类型的键值
cJSON_CreateArray | 创建数组类型的键值
cJSON_CreateObject |创建json类型的键值

例子

```
#include <stdio.h>
#include <cJSON.h>

int main()
{
? ? cJSON *pJsonObj = NULL;
? ? cJSON *pJsonStudents = NULL;
? ? cJSON *pJsonStudent = NULL;
? ? cJSON *pJsonStudent1 = NULL;
? ? int iNum = 0;

? ? pJsonObj = cJSON_CreateObject();
? ? if(!pJsonObj)
? ? {
? ? ? ? printf("error:[%s\n]",cJSON_GetErrorPtr());
? ? ? ? return -1;
? ? }

? ? cJSON_AddItemToObject(pJsonObj,"num", cJSON_CreateNumber(2));
? ??
? ? pJsonStudent = cJSON_CreateObject();
? ? cJSON_AddItemToObject(pJsonStudent,"name",cJSON_CreateString("lilei"));
? ? cJSON_AddItemToObject(pJsonStudent,"age",cJSON_CreateNumber(27));
? ? cJSON_AddItemToObject(pJsonStudent,"age",cJSON_CreateString("man"));

? ? pJsonStudent1 = cJSON_CreateObject();
? ? cJSON_AddItemToObject(pJsonStudent1,"name",cJSON_CreateString("hanmeimei"));
? ? cJSON_AddItemToObject(pJsonStudent1,"age",cJSON_CreateNumber(25));
? ? cJSON_AddItemToObject(pJsonStudent1,"age",cJSON_CreateString("woman"));

? ? pJsonStudents = cJSON_CreateArray();
? ? cJSON_AddItemToArray(pJsonStudents,pJsonStudent);
? ? cJSON_AddItemToArray(pJsonStudents,pJsonStudent1);

? ? cJSON_AddItemToObject(pJsonObj,"strdents",pJsonStudents);

? ? //非格式化打印
? ? printf("unformat print:\n%s\n",cJSON_PrintUnformatted(pJsonObj));

? ? //释放json
? ? cJSON_Delete(pJsonObj);
? ? return 0;
}
```

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 11:21:26  更:2021-09-06 11:23:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 5:35:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码