C++中使用Json

1. Json简介

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。Json的格式更加简单,同样的内容,用Json来表示比用XML表示时字符少的多,没有一大堆的标记及尖括号,决定了Json更加容易手写。同样的,字符少,信息量大,所以我认为也更加易读。

Json有多流行?Json官网看看有多少语言的解析库,你就明白了。Json支持了几乎所有你见过的,没见过的编程语言。

2. Json的作用

假如我们从Js端向C++端传递多个参数时,该怎么传递?一个个传?这样各参数之间就没有了对应关系,并且传多次也比较麻烦。这时我们就需要Json了。Json可以把多个参数封装成Json对象,然后转换为String。这个String中就包含了所有的参数,并且各参数间的隶属关系一目了然。那么,每次我们只传递这一个String就行了。同样,从C++端向Js端传递信息也是这个道理。


3. Json-C++

3.1下载及使用

3.1.1下载

官网地址:http://www.json.org/

       C++使用Json时,一般采用第三方库jsoncpp来解析Json。jsoncpp 是比较出名的 C++ JSON 解析库。在 JSON 官网也是首推的。现在最新版本是0.5.0(2013/11/27)

下载地址为:http://sourceforge.net/projects/jsoncpp

3.1.2使用

有两种方法可以使用jsoncpp:

       <1> 直接拷贝源文件。(不推荐!这个方法比较简单,但不便于项目管理)

       1)解压下载好的文件:jsoncpp-src-0.5.0.tar.gz。(也可使用配置VS工程环境的方法)

       2)将jsoncpp-src-0.5.0\include目录下的json文件夹拷贝至你的工程目录下

3)将jsoncpp-src-0.5.0\src\lib_json目录下的所有.h, .cpp 文件全部拷贝至

 TestJSON 工程目录下。(也可使用配置VS工程环境的方法)

4)在工程中引入刚才拷贝入的文档。(如使用环境配置法,则不需要此步骤)

       5)#include "include\json\json.h"

6) 至此,就可使用Json了。

<2> 使用静态链接库

要使用静态链接库,首先要生成.lib文件。也就是我们需要自己编译生成库文件。jsoncpp 已经处理的很完善了,所有编译选项都已经配置好,打开makefiless/vs71/jsoncpp.sln便可以开始编译(默认是使用 VS2003 编译器的,打开时直接按照 VS2010 提示转换即可)。   

打开工程后,会有三个工程,如下:


我们只需Buildlib_json即可。

编译完成后,会在jsoncpp-src-0.5.0文件夹下生成一个build文件夹,在build\vs71\debug文件夹下,会生成json_vc71_libmtd.lib文件,这个就是我们需要的静态库。注意,Debug和Release下的json lib是不同的,Debug下的文件名为json_vc71_libmtd.lib,Release下的文件名为json_vc71_libmt.lib。

使用静态库时,在工程中引入该库。通用命令为:

#pragma comment(lib,"lib/json_vc71_libmtd.lib")

1)编译生成.lib(如上)。

2) 配置include目录

3) #include"include\json\json.h"

3.2.3可能出现的错误

       (1) fatal error C1083: 无法打开编译器生成的文件:../../build/vs71/release/lib_json\json_writer.asm: No such file ordirectory

       Debug模式下编译,应该是没有错误的,如果出现链接错误或者是找不到文件,请查看文件路径设置对不对。需要注意的是Release模式下编译,有可能会出现fatal error C1083: 无法打开编译器生成的文件:“../../build/vs71/release/lib_json\json_writer.asm”: No such file or directory ,我也出现了这个错误。后来在网上查找原因,好像是jsoncpp的项目编译设置的问题。需要在jsoncpp的项目设置中做如下修改:


(2) errorLNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项:值“2”不匹配值“0

       这是由于Debug下使用了Release的库或者Release下使用了Debug的库。

4. 应用解析

jsoncpp 主要包含三种类型的 class: ValueReaderWriter。jsoncpp 中所有对象、类名都在 namespace Json 中,包含 json.h 即可。

4. 创建Json对象-Value

       Json::Value 是jsoncpp 中最基本、最重要的类,用于表示各种类型的对象,jsoncpp 支持的对象类型。

       Json::Valueroot;      //表示整个Json对象

         root["key_string"]= Json::Value("value_string");     //string

         root["key_number"]= Json::Value("12345");                     //integer

         root["key_boolean"]= Json::Value("false");                       //bool

         root["key_double"]= Json::Value("3.14159");          //double

         root["key_object"]= Json::Value("Json_temp");               //Json::Value

         root["key_array"].append("array_string");       //新建一个数组,对第一个元素赋值为字符串:"array_string"

         root["key_array"].append(1234);     // 为数组 key_array 赋值,对第二个元素赋值为:1234

4. Json对象转String-Writer

       如上说了 Json::Value 的使用方式,现在到了该查看刚才赋值内容的时候了,查看 json 内容,使用 Writer 类即可。

Jsoncpp 的 Json::Writer 类是一个纯虚类,并不能直接使用。在此我们使用 Json::Writer 的子类:Json::FastWriter、Json::StyledWriter、Json::StyledStreamWriter。

顾名思义,用Json::FastWriter 来处理 json 应该是最快的。

Json::FastWriter fast_writer;

         std::string res =fast_writer.write(root);

         std::cout<<res<<std::endl;

         结果为:


4.3 String转Json对象-Reader

       Json::Reader 是用于读取的,说的确切点,是用于将字符串转换为 Json::Value 对象的,下面我们来看个简单的例子。Reader中最常用的就是一个parse方法,该方法用来将载入的json字串解析为C++格式的数据。

Json::Reader reader;

         Json::Value root_read;     //用于接收的Json::Value

         reader.parse(res,root_read,false);              //string res转成Json对象

         std::cout<<root_read["key_number"];     //可以输出查看

         std::cout<<root_read["key_object"];        //也可输出对象

         std::cout<<root_read["key_array"];//还可输出数组

结果为:


  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值