这里写目录标题
下载源码并编译为动态库
下载源码
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值升序排列
