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
PS:可以选择Release或Debug版本进行编译 。为了避免一些编译出错,还要对该项目属性进行配置:
若编译时选择运行时库为“多线程MT”,用到jsoncpp库的工程中也要选择该项,不然编译会出错!
接下来还要配置汇编输出为“无列表”:
Step2:Crtl+F5运行即生成lib文件,生成的lib文件在jsoncpp-src-0.5.0\build\vs71中找到。
不同编译版本生成的lib文件不同,在使用时也要注意这点!Debug版本生成的是json_vc71_libmtd.lib,Release版本生成的是json_vc71_libmt.lib
至此,jsoncpp的静态库已生成,接下来就是说明如何使用啦~ヾ(◍°∇°◍)ノ゙
二、Jsoncpp的静态库在工程中的使用
1. 工程中所在目录包含相关的头文件和lib
Step1:新建了一个工程项目,名字为testJson,其目录树为:
json文件夹就是是jsoncpp-src-0.5.0\include\json,其内容为:
Step2:在工程代码中包含jsoncpp的头文件和lib文件
为了和工程其他代码分开,将json文件和lib文件放在了common文件夹中,从二-->1-->Step1的目录树可看出。
2. 利用Jsoncpp库读写json文件
现在工程中可以直接使用jsoncpp库封装好的函数,我们直接调用这些函数实现读写json文件~٩(๑>◡<๑)۶
2.1 json文件格式的简单介绍
emmm,下面简单科普一下json文件的格式。对json文件格式很熟悉的可以跳过这部分~
JSON具有以下这些形式:
1)对象是一个无序的“‘名称/值’对”集合。一个对象以“{”开始,“}”结束。每个“名称”后跟一个“:”;“‘名称/值’ 对”之间使用“,”分隔。
2)数组是值(value)的有序集合。一个数组以“[”开始,“]”结束。值之间使用“,”分隔。
3)值(value)可以是双引号括起来的字符串(string)、数值(number)、
true
、false
、null
、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(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文件,后面再补写~