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值升序排列

相关推荐
云水一下6 小时前
零基础玩转bWAPP靶场(四十五):XSS - Reflected (JSON)
web安全·json·xss·bwapp·reflected
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ1 天前
Spring‑AI Document 对象 JSON 字段详解
人工智能·spring·json
sunywz1 天前
【从零搭建物联网智能充电桩系统】2、自定义二进制协议:设备为什么不用 JSON?
python·物联网·json
灵析表格1 天前
灵析表格手机号处理函数深度分析报告
前端·网络·json·wps·灵析表格·excel公式盒子
猿长大人2 天前
C# | JSON 序列化中的多态接口处理:基于 Attribute 实现精准 $type 控制
c#·json
消失的旧时光-19432 天前
第六篇:Redis Hash——一个用户对象应该保存成 JSON,还是保存成 Hash?
redis·json·哈希算法
SEO_juper2 天前
2026年Schema自动注入实战:用Python批量给1000个页面加上JSON-LD,AI引用率实测提升38%
人工智能·python·json·seo·独立站
Wang's Blog2 天前
AI Agent白手起家37: LangChain 输出解析器实战:文本、JSON、XML 与 Pydantic
xml·langchain·json
灵析表格2 天前
json_ObjectToKV 函数深度研究报告
json·excel·wps·灵析表格·excel公式盒子
wtsolutions2 天前
JSON 怎么导入 WPS?怎么转换成 WPS 表格?WPS 怎么打开 JSON?完整教程
json·wps