第二讲c++JSON 数据解析
2.1、JSON 数据格式
数 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于 JavaScript
(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON 采用完全独立于
语言的文本格式,但是也使用了类似于 C 语言家族的习惯(包括 C, C++, C#, Java, JavaScript,
Perl, Python 等)。这些特性使 JSON 成为理想的数据交换语言。易于人阅读和编写,同
时也易于机器解析和生成。
2.2、JSON 语法
JSON 语法是 JavaScript 对象表示法语法的子集。
数据在名称/值对中
数据由逗号分隔
花括号保存对象
方括号保存数组
2.2.1、JSON 名称/值对
JSON 数据的书写格式是:名称/值对。
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
"firstName" : "John"
这很容易理解,等价于这条 JavaScript 语句:
firstName = "John"
2.2.2、JSON 值
JSON 值可以是:
数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true 或 false)
1
数组(在方括号中)
对象(在花括号中)
null
2.2.3、JSON 对象
JSON 对象在花括号中书写:
对象可以包含多个名称/值对:
{ "firstName":"John" , "lastName":"Doe" }
这一点也容易理解,与这条 JavaScript 语句等价:
firstName = "John"
lastName = "Doe"
2.2.4、JSON 数组
JSON 数组在方括号中书写:
数组可包含多个对象:
{
"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]
}
在上面的例子中,对象 "employees" 是包含三个对象的数组。每个对象代表一条关于某人(有姓和名)的记录。
2.3、jsoncpp 库简介
Jsoncpp 是 C++中用于构成和解析 JSON 的第三方库。下载地址为:三
http://sourceforge.net/projects/jsoncpp (本文使用的 jsoncpp 版本为:0.5.0)。使用
jsoncpp 需要在 vs 中进行编译。需要根据不同的 vs 版本编译成不同的 jsoncpp 库。
2
编译完成后,将 json.h 头文件导入到工程中,然后将相应的 jsoncpp 库文件拷贝到
vs 的工程目录下。在项目中导入 jsoncpp 的静态链接库即可使用 jsoncpp 了。
2.3.1、编译 jsoncpp 静态链接库
Jsoncpp 需要编译两个版本,一个是 debug 调试版,以便在程序调试时使用。一个
个时 release 版,以便于程序发布时使用。
1、jsoncpp0.50 项目结构
1) 目录结构
jsoncpp0.50 的目录包括:
Build 目录,包括 debug 和 release 两个子目录。最终生成的库文件保存到
此目录中。Build/vs71/debug/lib_json 下存储着调试版的静态链接库,如
图:
3
Build/vs71/release/lib_json:下存储着编译好的发行版的静态链接库库
文件。如图:
Include 目录,存放头文件。
Makefiles 目录,存放编译所需的文件
Src 存放源文件,其中包含了三个项目的文件夹。
2) 工程结构
jsoncpp0.50 项目包括三个工程。进入上述目录结构的 makefiles/vs71 目录下。如下图所
示:
4
双击该文件,在 vs 中打开 jsoncpp0.50 项目。如图:
要生成静态链接库,我们只需要使用第二个工程(lib_json)即可。
2、 编译生成静态链接库
编译器属性设置,需要打开 lib_json 工程的属性,步骤如下图所示:
5
1) 编译器设置
在编译静态链接库之前需要对编译环境进行设置。
配置生成库
Lib_json 项目和使用 lib_json 项目生成的静态链接库的项目在编译时都会依赖
于生成库。生成库有多线程调试版静态生成库、多线程发行版静态生成库、多
线程调试版动态生成库、多线程发行版动态生成库。
Lib_json 项目生成后,需要生成调试版和发行版两个版本的静态库文件。配置
生成库的目的是:将 lib_json 项目和使用 lib_json 项目生成的静态库文件的项目
的生成库设置为一样的库。
生成库配置选项如下图所示:
6
生成库有四种:静态库发行版(release)MT(Multi-thread)、静态库调试
版(debug)MTD(multi-thread debug)、动态库发行版(release)MD(multi_dll),
动态库调试版 MDd(multi-dll debug)。
一般情况下,MFC 工程中都使用多线程 DLL 或多线程调试 DLL。一般我们
不需要设置,在 vs 中我们可以设置是生成发行版还是调试版,一般在程序设计
期间,我们需要设置断点来调试程序,所以在编译生成代码时将工程设置为调
试版本。而交付给用户时,需要将编译生成的代码设置为发行版。如下图所示:
设置以后,生成库会自动切换为调试版或发行版的静态库或动态库。
我们在生成自己的库文件时,将 jsoncpp0.50 工程的生成库设置为与我们使用
jsoncpp0.50 静态库工程的生成库设置为一致。
配置依赖库
工程生成时会依赖很多默认库。在 jsoncpp0.50 生成的静态库中不要包含这些默
认库。否则在使用 jsoncpp0.50 静态库的工程中会出现很多重复定义的错误。如
下:
错误 1 error LNK2005: _free 已经在 libcmtd.lib(dbgheap.obj) 中定义
MSVCRT.lib
错误 2 error LNK2005: _malloc 已经在 libcmtd.lib(dbgheap.obj) 中定义
7
MSVCRT.lib
因此,我们在设置方式如下:
选择“忽略所有默认库”
配置汇编程序输出
必须将静态链接库的汇编程序输出的输出文件设置为“无列表”。否则在编译
使用静态库的工程时会出现:“json_value.asm 文件或路径不存在”的错误。
设置如下图所示:
8