JsonCpp的编译与使用

这里写目录标题

下载源码并编译为动态库

下载源码

JSONCPP源码仓库地址:

https://github.com/open-source-parsers/jsoncpp

克隆或者下载压缩包,将源码下载到本机

PS:如果克隆github仓库代码失败,来到此目录,查看该文档:

PS2:如果https不稳定,使用ssh克隆

编译为动态库

注意

由于我们本次测试是在win平台,所以,要编译为win平台下的动态库

cmake(GUI)

使用cmake来编译生成动态库

配置和生成sln(即,产生"构建系统")

1、指定源文件目录和最终文件的生成目录:

生成目录是我新建的一个文件夹

2、点击"configure"前往配置一下:

选择VS2022,其他的默认即可

出现以下画面,就是配置完成了

3、生成项目

点击"Generate"生成

表示配置和生成均成功

生成动态库

之后,来到输出目录,找到jsoncpp.sln,用VS打开

找到jsoncpp_lib,右键 生成(相当于build构建一下刚刚生成的"构建系统sln",也是我们常说的"编译"):

之后可以看到,输出了

1、生成动态库导入库,以lib为后缀,注意,并不是静态库,而是与动态库配套的(win平台下就是这样)

2、生成jsoncpp动态库

最后,将这两个库拿到一个自定义文件夹即可(方便找到路径,做不做都行)

JSONCPP使用介绍

JsonCpp支持的类(C++类)

注意上面的

序列化:C++对象-->JSON字符串

反序列化:JSON字符串-->C++对象

Value类

简介

这个类是一个包装器,可以封装JsonCpp支持的所有类型

前六行就是那些常用的数据类型

第七行,是一个数组类型,对应json字符串中的[],该数组类型所存放的元素可以不同类型

第八行,是一个对象类,对应json字符串中的{},他可以存放上面所有类型的key:value,其中,key必须是标准型字符串类型:string或者C语言字符串char str[],value可以是上面的任何一个类型xxxValue(也可以直接用标准类变量,他会自动调用默认构造转为xxxValue类对象)

构造函数

构造函数传入的是标准类

检测数据类型,检测当前被构造的Value类是JsonCpp对应的数据类 的哪一个

即,检测是xxxValue中,xxx是什么

将xxxValue类型对象转为标准类型变量


上图不包括JsonCpp中的数组和对象

LargestInt是长整形

JSONCPP_STRING看做string即可

对arrayValue对象的操作

1、size()函数,会返回该数组的元素个数,上图的返回值ArrayIndex实际上就是长整型

2、其可以使用下标[]进行元素读取,返回值还是一个xxxValue对象,可以对其对象再次操作

除了重载了[],还可以用get方法,传入两个参数,参数一是index,

当索引index有效时,返回那个位置对应的xxxValue对象

当索引index无效时,不会报错,而是返回你传入的第二个参数:默认的xxxValue对象

append:在数组的最后添加一个新元素

迭代器操作,如果使用const限定的迭代器操作,那我们不能通过*it来修改数据,因为他返回一个const指针,底层const

对objectValue对象的操作

其重载了[],可以传入key,得到对应的JsonCpp的xxxValue

PS:key必须是字符串,可以是C风格,也可以是C++string风格

且提供了const和非const

与数组一样,除了重载[],还提供了get方法

当可以生效时,会返回所对应的xxxValue对象

当指定的key失效时,会返回参数二,即我们指定的默认xxxValue对象

得到xxxValue对象中所有的key值

xxxValue对象序列化(含FastWriter类)

xxxValue类的API

FastWriter类的API

两个方法都可以将一个xxxValue对象序列化为一个json字符串,只不过第一个会自动加上换行符,第二个不会换行

Reader类

parse

重载版本:

可以指定某一个部分进行解析

重载版本:

直接去一个文件流中读取,不用我们再读文件流,再转为字符串,在调用第一个parse了

所以,这个最常用

项目练习

导入jsoncpp库

链接动态库

1、导入头文件:

C/C+±->常规-->附加包含目录:

D:\JsonCpp\jsoncpp\include

2、导入库目录:

链接器-->常规-->附件库目录

D:\JsonCpp\lib

3、配置"动态库导入库库名":

链接器-->输入-->附加依赖项

jsoncpp.lib

PS,注意是动态库导入库

序列化

引入头文件

因为我们指定头文件只指定到了include那一层文件夹,所以要使用json.h,要用json/json.h

构造如下信息的Value对象

最外层是一个数组,当然,常见的最外层也有可能是一个{},即objectValue

即,不管是使用xxxValue类,统一只用Value类,将其视为xxxValue类对象直接操作即可,其可以自动根据你调用的API推算出当前xxx是谁

系列化为json字符串

两种方法二选一

PS:#if 0就是告诉编译器,if部分不用编译;相对的 else部分要编译

使用io操作,将json字符串写入某文件流

上述代码会在main.cpp文件目录内 创建一个文件test.json,将json字符写入该文件

运行时会报错,找不到库文件,将库文件放置到exe文件所在目录即可

json字符串写入成功

反序列化

先解析json字符串到JsonCpp的Value对象

在两个if中加入分解逻辑

数组分支:

注意上图的每一个注释都很重要

最后运行结果:

PS

一般我们不用做如此繁琐的判断,因为json字符串的各数据顺序一般我们是知道的(json字符串的顺序就是构建json对象时放入元素的顺序,前后端都是这样,接口文档会规定),按照顺序拆解解析即可

**注意:**对于objectValue的key-value,由于JsonCpp在其底层用了map存储key-value,所以key-value会自动按照key值升序排列;

转为json字符串后,在字符串中key-value会自动按照key值升序排列

比如:

也可以这样,因为Json的key值和顺序我们都知道的

**注意:**对于objectValue的key-value转为json字符串后,在字符串中key-value会自动按照key值升序排列

相关推荐
凌晨一点的秃头猪3 小时前
JSON 文件基础介绍
json
凌晨一点的秃头猪5 小时前
Python JSON 模块核心函数超详细指南
json
小江的记录本7 小时前
【JWT】JWT(JSON Web Token)结构化知识体系(完整版)
前端·网络·web安全·http·网络安全·json·安全架构
早點睡3909 小时前
ReactNative项目OpenHarmony三方库集成实战:react-native-json-tree
react native·react.js·json
清水白石00817 小时前
Python 对象序列化深度解析:pickle、JSON 与自定义协议的取舍之道
开发语言·python·json
晨欣1 天前
如何根据 config.json 核对 MoE 模型的激活参数:以 gpt-oss-120b 为例(GPT-5.4-high 生成)
gpt·大模型·json·openai
带刺的坐椅1 天前
Snack4 Json 流式解析与自动结构修复深度指南
java·llm·json·jsonpath
m0_584624501 天前
调用接口返回的json数据被截断
java·json
ID_180079054732 天前
模拟1688商品详情的Python API实现,返回符合风格的JSON数据
开发语言·python·json