Cjson 库使用

server/2024/10/11 13:24:46/

1. JSON简介

        JSON全称 JavaScript Object Notation,即 JS对象简谱,是一种轻量级的数据格式。
它采用完全独立于编程语言的文本格式来存储和表示数据,语法简洁、层次结构清晰,易于人阅读和编写,同时也易于机器解析和生成,有效的提升了网络传输效率。

2. CJSON的安装

下载安装链接 :https://files.cnblogs.com/files/txwtech/cJSONFiles.zip

下载后解压压缩包,只需要将cJSON.c 和 cJSON.h 文件和自己的工程一起编译即可。

3. JSON语法

JSON对象是一个无序的"名称 / 值"键值对的集合:

  • 以"{“开始,以”}"结束,允许嵌套使用;
  • 每个名称和值成对出现,名称和值之间使用":"分隔;
  • 键值对之间用" , "分隔
  • 在这些字符前后允许存在无意义的空白符;

对于键值,可以有如下值:

  • 一个新的json对象
  • 数组:使用"[“和”]"表示
  • 数字:直接表示,可以是整数,也可以是浮点数
  • 字符串:使用引号 " 表示
  • 字面值:false、null、true中的一个(必须是小写)

4. cJSON常用函数

4.1. 构造json常用的函数

CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);	//创建对象---常用
CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);	//创建数组---常用
CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);//创建整型数组
CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);//创建双浮点型数组
CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);//在对象中添加null
CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);//在对象中添加true
CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);//在对象中添加false
CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);//在对象中添加数字
CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);//在对象中添加字符串
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);	//在对象中添加项目
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item);//在数组中添加项目CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);//JSON数据结构转换为JSON字符串---有格式
CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);	//JSON数据结构转换为JSON字符串---无格式CJSON_PUBLIC(void) cJSON_Delete(cJSON *item); //清除结构体

4.2. 解析json常用的函数

cJSON *cJSON_Parse(const char *value);
/*作用:将一个JSON数据包,按照cJSON结构体的结构序列化整个数据包,并在堆中开辟一块内存存储cJSON结构体
返回值:成功返回一个指向内存块中的cJSON的指针,失败返回NULL*/cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
/*作用:获取JSON字符串字段值
返回值:成功返回一个指向cJSON类型的结构体指针,失败返回NULL*/int cJSON_GetArraySize(cJSON *array);
/*作用:获取数组成员对象个数
返回值:数组成员对象个数*/void  cJSON_Delete(cJSON *c);
/*作用:释放位于堆中cJSON结构体内存
返回值:无*/

5. cJSON使用

5.1. 构建json格式数据

{"name": "Jason","age": 39,"height": 1.92,"gender": "M","salary": 70000,"married": true,"skill": ["c", "Java", "Python"],"address": {"country": "China","zip-code": 11111}
}
#include <stdio.h>
#include "cJSON.h"int main() {	cJSON* cjson = NULL;cJSON* cjson_skill = NULL;cJSON* cjson_address = NULL;cjson = cJSON_CreateObject();cJSON_AddStringToObject(cjson, "name", "jason");cJSON_AddNumberToObject(cjson, "age", 39);cJSON_AddStringToObject(cjson, "gender", "M");cJSON_AddNumberToObject(cjson, "salary", 70000);cJSON_AddTrueToObject(cjson, "married");cjson_skill = cJSON_CreateArray();cJSON_AddItemToArray(cjson_skill, cJSON_CreateString("C"));cJSON_AddItemToArray(cjson_skill, cJSON_CreateString("Java"));cJSON_AddItemToArray(cjson_skill, cJSON_CreateString("Python"));cJSON_AddItemToObject(cjson, "skill", cjson_skill);cjson_address = cJSON_CreateObject();cJSON_AddStringToObject(cjson_address, "country", "China");cJSON_AddNumberToObject(cjson_address, "zip-code", 111111);cJSON_AddItemToObject(cjson, "skill", cjson_address);char *str = cJSON_Print(cjson);printf("%s\n", str);return 0;
}
{"name": "jason","age":  39,"gender":       "M","salary":       70000,"married":      true,"skill":        ["C", "Java", "Python"],"skill":        {"country":      "China","zip-code":     111111}
}

5.2. 解析json格式数据

5.2.1. 解析键值对

{"name": "Jason","age": 39,"height": 1.92,"gender": "M","salary": 70000,"married": true,
}
#include <stdio.h>
#include "cJSON.h"int main() {char strbuf[] = "{\"name\": \"Jason\",\"age\": 39,\"height\": 1.92,\"gender\": \"M\",\"salary\": 70000,\"married\": true}";cJSON* cjson = NULL;cJSON* tmp = NULL;cjson = cJSON_Parse(strbuf);tmp = cJSON_GetObjectItem(cjson, "name");printf("name : %s\n", tmp->valuestring);tmp = cJSON_GetObjectItem(cjson, "age");printf("age : %d\n", tmp->valueint);tmp = cJSON_GetObjectItem(cjson, "height");printf("height : %f\n", tmp->valuedouble);tmp = cJSON_GetObjectItem(cjson, "gender");printf("gender : %s\n", tmp->valuestring);tmp = cJSON_GetObjectItem(cjson, "salary");printf("salary : %d\n", tmp->valueint);tmp = cJSON_GetObjectItem(cjson, "married");printf("married : %d\n", tmp->valueint);cJSON_Delete(cjson);return 0;
}
name : Jason
age : 39
height : 1.920000
gender : M
salary : 70000
married : 1

5.2.2. 解析数组

{"name": "Jason","age": 39,"height": 1.92,"gender": "M","salary": 70000,"married": true,"skill": ["c", "Java", "Python"]
}
#include <stdio.h>
#include "cJSON.h"int main() {char strbuf[] = "{\"name\": \"Jason\",\"age\": 39,\"height\": 1.92,\"gender\": \"M\",\"salary\": 70000,\"married\": true, \"skill\": [\"c\", \"Java\", \"Python\"]}";int skill_array_size, i = 0;cJSON* cjson = NULL;cJSON* cjson_skill = NULL;cJSON* skill_item = NULL;cjson = cJSON_Parse(strbuf);cjson_skill = cJSON_GetObjectItem(cjson, "skill");skill_array_size = cJSON_GetArraySize(cjson_skill);for (i = 0; i < skill_array_size; i++) {skill_item = cJSON_GetArrayItem(cjson_skill, i);printf("%s\n", skill_item->valuestring);}cJSON_Delete(cjson);return 0;
}
c
Java
Python

5.2.3. 解析json嵌套数据

{"name": "Jason","age": 39,"height": 1.92,"gender": "M","salary": 70000,"married": true,"address": {"country": "China","zip-code": 11111}
}
#include <stdio.h>
#include "cJSON.h"int main() {char strbuf[] = "{\"name\": \"Jason\",\"age\": 39, \"address\": {\"country\": \"China\", \"zip-code\": 11111}}";int skill_array_size, i = 0;cJSON* cjson = NULL;cJSON* cjson_address = NULL;cJSON* address_item = NULL;cjson = cJSON_Parse(strbuf);cjson_address = cJSON_GetObjectItem(cjson, "address");address_item = cJSON_GetObjectItem(cjson_address, "country");printf("%s\n", address_item->valuestring);address_item = cJSON_GetObjectItem(cjson_address, "zip-code");printf("%d\n", address_item->valueint);cJSON_Delete(cjson);return 0;
}
China
11111

http://www.ppmy.cn/server/16228.html

相关文章

2000-2022年各区县农产品产量数据

2000-2022年县域农产品产量数据 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;统计年度、县域名称、所属地级市、所属省份、地区编码ID、县域代码、产品种类或名称、单位、产量、 3、来源&#xff1a;统计局、县域统计年鉴、各区县政府官网 4、范围&#xff1a;具体…

雅特力AT32F435学习——1.搭建环境

AT32F435开发环境搭建 整体开发环境我们首选使用KEILL MDKAT32F4芯片Pack包的方式进行&#xff0c;因为国产MCU厂商自己的开发IDE虽然便捷但是成熟度不高&#xff0c;潜在的坑比较多&#xff0c;使用界面还需要重新熟悉所以我们还是选择我们最擅长的KEILL下手&#xff0c;本次…

2024/4/25 C++day3

#include <iostream> using namespace std; class Person //Person类 {string name; //两个私有属性变量name&#xff0c;ageint age;public: //一个公有属性指针变量&#xff0c;一个无参构造函数&#xff0c;一个有参构造函数&#xff0c;一个sho…

使用 Flask 和 WTForms 构建一个用户注册表单

在这篇技术博客中&#xff0c;我们将使用 Flask 和 WTForms 库来构建一个用户注册表单。我们将创建一个简单的 Flask 应用&#xff0c;并使用 WTForms 定义一个注册表单&#xff0c;包括用户名、密码、确认密码、邮箱、性别、城市和爱好等字段。我们还将为表单添加验证规则&…

刚刚,ChatGPT重大更新!GPT-4更加聪明,已成毕业论文撰写润色修改最佳利器!

今天ChatGPT Plus版本做了升级。GPT-4增强了记忆功能&#xff0c;能够通过你的多次对话了解你的意图&#xff0c;并提供合适的回应&#xff0c;总结一句话就是&#xff1a;更加懂你&#xff01; ChatGPT到底能干什么&#xff1f;我简单总结一下&#xff1a; 翻译&#xff1a;中…

pytest教程-31-mock数据插件-pytest-mock

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest测试数据管理插件-pytest-datadir&#xff0c;本小节我们讲解一下mock数据插件-pytest-mock。 pytest-mock 是一个 pytest 插件&#xff0c;它提供了一个名为 mocker 的 fixture&#x…

《苍穹外卖》Day08部分知识点记录

一、useGeneratedKeys和keyProperty useGeneratedKeys和keyProperty是<insert>标签中的两个属性&#xff0c;用于处理自动生成的主键值。 1. useGeneratedKeys userGeneratedKeys"true"表示启用自动生成主键功能&#xff1b;当useGeneratedKeys设置为true时…

单例模式可以被破坏

通过反射的方式破坏单例模式 解决&#xff1a;在构造函数中添加判断 private Singleton() {if (singleton ! null) {throw new RuntimeException("Singleton constructor is called... ");} } 序列化和反序列化破坏单例模式 解决&#xff1a;在Sinleton中增加rea…