Jsoncpp库编译为静态库及使用其读写json文件

题外话:最近又遇到读取json文件问题,虽然一个月前也利用过Jsoncpp库读取json文件,但是现在只是知道json文件可以用jsoncpp库读取,但是不知道怎么读以及怎么将jsoncpp库编译为静态库。为了加深印象,自己也写篇小白教程,以后要是忘了还可以再瞅瞅~(◉ω◉υ)⁼³₌₃

环境:VS2008 + jsoncpp-src-0.5.0

一、将Jsoncpp库编译为静态库

1. 下载Jsoncpp

我们可从jsoncpp官网https://sourceforge.net/projects/jsoncpp/下载jsoncpp库相关源文件,也可以从我的资源中https://download.****.net/download/quellaaa/10752666下载已经编译好的静态库lib文件。

2. 编译Jsoncpp为静态库

step1:用vs2008打开jsoncpp-src-0.5.0\makefiles\vs71\jsoncpp.sln

Jsoncpp库编译为静态库及使用其读写json文件

PS:可以选择Release或Debug版本进行编译 。为了避免一些编译出错,还要对该项目属性进行配置:

Jsoncpp库编译为静态库及使用其读写json文件

若编译时选择运行时库为“多线程MT”,用到jsoncpp库的工程中也要选择该项,不然编译会出错!

接下来还要配置汇编输出为“无列表”:

Jsoncpp库编译为静态库及使用其读写json文件

Step2:Crtl+F5运行即生成lib文件,生成的lib文件在jsoncpp-src-0.5.0\build\vs71中找到。

Jsoncpp库编译为静态库及使用其读写json文件

不同编译版本生成的lib文件不同,在使用时也要注意这点!Debug版本生成的是json_vc71_libmtd.libRelease版本生成的是json_vc71_libmt.lib

至此,jsoncpp的静态库已生成,接下来就是说明如何使用啦~ヾ(◍°∇°◍)ノ゙

二、Jsoncpp的静态库在工程中的使用

1. 工程中所在目录包含相关的头文件和lib

Step1:新建了一个工程项目,名字为testJson,其目录树为:

Jsoncpp库编译为静态库及使用其读写json文件

json文件夹就是是jsoncpp-src-0.5.0\include\json,其内容为:

Jsoncpp库编译为静态库及使用其读写json文件

Step2:在工程代码中包含jsoncpp的头文件和lib文件

Jsoncpp库编译为静态库及使用其读写json文件

为了和工程其他代码分开,将json文件和lib文件放在了common文件夹中,从二-->1-->Step1的目录树可看出。

2. 利用Jsoncpp库读写json文件

现在工程中可以直接使用jsoncpp库封装好的函数,我们直接调用这些函数实现读写json文件~٩(๑>◡<๑)۶ 

2.1 json文件格式的简单介绍

emmm,下面简单科普一下json文件的格式。对json文件格式很熟悉的可以跳过这部分~

JSON具有以下这些形式:

1)对象是一个无序的“‘名称/值’对”集合。一个对象以“{”开始,“}”结束。每个“名称”后跟一个“:”;“‘名称/值’ 对”之间使用“,”分隔。

Jsoncpp库编译为静态库及使用其读写json文件

2)数组是值(value)的有序集合。一个数组以“[”开始,“]”结束。值之间使用“,”分隔。

Jsoncpp库编译为静态库及使用其读写json文件

3)值(value)可以是双引号括起来的字符串(string)、数值(number)、truefalse、 null、对象(object)或者数组(array)。这些结构可以嵌套。

Jsoncpp库编译为静态库及使用其读写json文件

字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。字符串(string)与C或者Java的字符串非常相似。

经过上面的简要的介绍,现在对json格式有简单的认识啦~接下来开始讲解如何使用jsoncpp库函数读写json文件~

PS:推荐一个在线json解析网站https://www.bejson.com/,可用于发现json格式是否出错以及将字符串弄成json格式中

2.2 Jsoncpp使用详解

JsonCpp 主要包含三种类型的 class:Value、Reader、Writer。Json::Value 只能处理 ANSI 类型的字符串,如果 工程是用 Unicode 编码的,最好加一个 Adapt 类来适配。

  • 将Json字符串解析到root

利用Json::Reader将json格式的字符串解析到Json::Value类型的root变量中。

json格式的字符串如下:
{
	"key1": "value1",
	"array": [
		"value2",
		{
			"key3": "value3"
		}
	]
}
Json::Reader reader; 
Json::Value root; 
// 将json格式的字符串读取解析到root中
reader.parse(strValue, root);
  • 读取root中的键-值​​​:key1的值

string value = root["key1"].asString();
  • 读取root中的键-对象:array的值

JSON::Value arrayObj;
arrayObj = root["array"];
// 读取数组的内容
//string value = arrayObj[0].asString();   
// 下标为0会报错,原因不明。改进方法为:
int index = 0;
string value = arrayObj[index].asString();   
string objValue = arrayObj[1]["key3"].asString();

目前先讲述简单的读json文件,后面再补写~