当前位置:网站首页 > 技术博客 > 正文

jsoncpp解析json



Json

在前面的文章中为大家介绍了C语言中如何,接下来讲一下在C++中的处理,这里给大家介绍一个开源的库。

Jsoncpp是个跨平台的C++开源库,提供的类为我们提供了很便捷的操作,而且使用的人也很多。在使用之前我们首先要从仓库下载源码,地址如下:

由于C++程序猿都是基于VS进行项目开发,下载的源码我们一般不会直接使用,而且将其编译成相应的库文件(动态库或者静态库),这样不论是从使用或者部署的角度来说,操作起来都会更方便一些。

但是,从下载的源码不能直接通过,编译就更谈不上了。它提供的默认编译方式是。我们可以通过使用工具将下载的源码生成一个,这样就可以通过编译出需要的库文件了。

CMake工具的官方下载地址如下:

在这最新的安装包,根据向导完成安装即可。

打开安装好的工具

需要在工具中指定本地的路径(git clone 之后就会得到这个目录),这是我本地的目录:

第二个需要指定的是一个文件存储路径(生成的VS项目会保存到这个目录下),保证这是一个本地的有效目录即可。

设置好之后进行配置,点击按钮

此处需要设置一下,VS的版本以及生成器的平台位数,不填默认就是64位。

配置完成,开始生成VS项目。

打开在工具中指定的生成目录,我这里是,基于项目文件打开这个VS项目。

基于生成的项目文件打开VS项目之后,可以看到里边有很多子项目

我们只需要编译上图标记的那一个就可以了,编译成功之后就可以得到我们需要的库文件了。

通过输出的日志信息,就能找到我们想要的动态库了,把这两个文件收集起来备用。

库中的类被定义到了一个命名空间中,建议在使用这个库的时候先声明这个命名空间:

使用库解析格式的数据,我们只需要掌握三个类:

  1. :将json支持的数据类型进行了包装,最终得到一个Value类型
  2. :将Value对象中的数据序列化为字符串
  3. :反序列化, 将json字符串 解析成 Value 类型

这个类可以看做是一个包装器,它可以封装Json支持的所有类型,这样我们在处理数据的时候就方便多了。

枚举类型 说明 翻译 nullValue ‘null’ value 不表示任何数据,空值 intValue signed integer value 表示有符号整数 uintValue unsigned integer value 表示无符号整数 realValue double value 表示浮点数 stringValue UTF-8 string value 表示utf8格式的字符串 booleanValue bool value 表示布尔数 arrayValue array value (ordered list) 表示数组,即JSON串中的[] objectValue object value (collection of name/value pairs) 表示键值对,即JSON串中的{}

Value类为我们提供了很多构造函数,通过构造函数来封装数据,最终得到一个统一的类型。

如果想要在VS中使用编译出的库,我们还需要做如下配置:

在编码过程中需要在项目文件中包含从下载得到的头文件,有两种处理方式:

  1. 将头文件放到项目目录下,直接被项目包含引用
  2. 将头文件放到一个本地固定目录,以后就不再动了,在VS项目属性中设置包含这个目录,我推荐这种

另外,在这个目录中还有一个子目录,所有的头文件都在这个子目录中,我们不要破坏这个目录结构:

在包含需要的头文件的时候,使用如下这种方式:

把本地的头文件目录在项目属性窗口中进行配置:

我这里头文件是放到了的中:

我这里也是将生成的和放到了,在VS项目中需要指定这个库路径:

另外,还需要告诉VS需要加载的动态库是哪一个

此处指定的是动态库对应的文件,也就是

配置完成之后,如果项目中使用了就可以了。在程序执行的时候,如果提示找不到的动态库,

比如:我们要将下面这个Json数组写入的一个文件中

在上面读Json文件的这段代码中,对读出的每个Value类型的节点进行了类型判断,其实一般情况下是不需要做这样的判断的,因为我们在解析的时候是明确地知道该节点的类型的。

虽然Json这种格式无外乎数组和对象两种,但是需求不同我们设计的Json文件的组织方式也不同,一般都是特定的文件对应特定的解析函数,一个解析函数可以解析任何的Json文件这种设计思路是坚决不推荐的。

版权声明


相关文章:

  • log4j2异步日志配置2025-06-03 21:30:00
  • python网络爬虫软件2025-06-03 21:30:00
  • 数据库设计规范标准2025-06-03 21:30:00
  • json.stringify字符串2025-06-03 21:30:00
  • uint8_t和unsigned char2025-06-03 21:30:00
  • c++默认拷贝构造函数2025-06-03 21:30:00
  • 计算机网络系统主要由什么构成?2025-06-03 21:30:00
  • xml转json对象2025-06-03 21:30:00
  • 基于内容的推荐算法2025-06-03 21:30:00
  • redis入门指南2025-06-03 21:30:00