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

相关推荐
ID_1800790547312 小时前
除了 Python,还有哪些语言可以解析 JSON 数据?
开发语言·python·json
电商API&Tina1 天前
跨境电商如何接入1688官方寻源通接口?附接入流程
java·数据库·python·sql·oracle·json·php
神の愛2 天前
利用json-to-ts工具进行转换,放置在typeScript.ts文件中
javascript·typescript·json
BUG_MeDe2 天前
从Json对象中提取某个对象的一点注意--libjson-c
linux·json
HelloTonyGo2 天前
个人游戏笔记本免费“养龙虾”(七)OpenClaw的openclaw.json文件的基本配置
ubuntu·json·配置·读写权限·openclaw
数据知道3 天前
claw-code 源码详细分析:`reference_data` JSON 快照——大型移植里「对照底稿」该怎么治理与演进?
linux·python·ubuntu·json·claude code
不会写DN3 天前
让 gRPC 服务同时支持 HTTP/JSON 的gRPC-Gateway
http·json·gateway
bloglin999994 天前
掌握解析JSON输出的技巧:使用LLM生成结构化数据
json
电商API&Tina5 天前
【京东item_getAPI 】高稳定:API 、非爬虫、不封号、不掉线、大促稳跑
大数据·网络·人工智能·爬虫·python·sql·json
LittroInno5 天前
T-JSON跨平台网络通信协议——边缘认知设备的二次开发实战指南
人工智能·计算机视觉·目标跟踪·json