C++实现json转换,使用JsonCpp第三方库,详细说明

来源:互联网 发布:怎么抢注域名 编辑:程序博客网 时间:2024/06/05 04:55

现在json的广泛使用就不必多说了,它的重要性也是不言而喻的。对于android和ios而言json解析非常方便。C++上面相对而言麻烦一点,但是使用第三方的jsoncpp库却是非常方便的。

jsoncpp的使用网上一搜一大把,但是很多很多教程说明,按照其步骤总是或多或少有些问题,对于经验不丰富或者初次接触的人而言,每个小问题都是那样的让人沮丧。

话不多说咱们来看看详细过程。

1、工欲善其事,必先利其器,下载jsoncpp,链接:jsoncpp代码下载。(我下载的版本是jsoncpp-src-0.5.0.tar.gz)

2、下载完成后,解压jsoncpp-src-0.5.0.tar.gz你会看到很多傻傻分不清楚的文件。用visual的童鞋们直接进入jsoncpp-src-0.5.0\makefiles\vs71目录你会发现一个sln的文件。这就是所有用visual的同学的最爱啊,还由于神马?戳他。用visual08或者更高的版本吧。

3、打开工程后会发现有三个工程。oh My god!这就是晴天霹雳,尼玛三个工程几个意思?而且按个F5还报神马鬼错。。。开始崩溃了。

4、平复下心情,继续问度娘。黄天不负有心人,原来只有lib_json这个工程才是关键,其与两个就是障眼法。直接无视。

5、直接lib_json右键编译生成lib库文件。(说明下,这个玩意有个比较坑的事情是:它的debug库跟release库名字不一样,也就是说如果你的工程debug的时候要使用debug库,release的时候要使用release的库。)

6、说个注意事项吧,如果在编译release版本的库时候出现----fatal error C1083: 无法打开编译器生成的文件:“../../build/vs71/release/lib_json\***.asm”: No such file or directory。

解决方法: lib_json -> Properties -> Configuration Properties -> C/C++ -> Output Files -> Assembler Output->change it to No Listing

=======================================至此已经成功一半了==================================================


剩下的就是应用来。


1、自己建一个自己的win32工程。

2、把\jsoncpp-src-0.5.0\include\json目录下的所有头文件copy到你的工程中去。并导入。

3、在要应用的json的类中添加#include "json.h"头文件。在stdafx.h中添加

#ifdef _DEBUG
#pragma comment(lib, "json_vc71_libmtd.lib") 
#else
//json_vc71_libmt.lib
#pragma comment(lib, "json_vc71_libmt.lib") 
#endif

加载静态库,再次提醒,debug模式下,使用debug库,

4、前面都是准备工作,接下来就是json的字符串处理和操作了。(这段是copy网上的一个例子,只是一个参考)

从字符串解析json
// json字符串解析


{"ProInfo":[{"OID":"1","ProType":"IFH","ProName":"509","ProCode":"1"},{"OID":"2","ProType":"IHG","ProName":"1509","ProCode":"2"},{"OID":"3","ProType":"PA","ProName":"1601","ProCode":"3"}]}



Json::Reader reader;  
Json::Value root;  
if (reader.parse(jsonString, root))  // reader将Json字符串解析到root,root将包含Json里所有子元素  
{  
int size = root["ProInfo"].size();
for(int i = 0 ; i < size; ++ i){
TRACE(" %s   %s    %s \n",root["ProInfo"][i]["ProType"].asString().c_str(),root["ProInfo"][i]["ProName"].asString().c_str(),root["ProInfo"][i]["ProCode"].asString().c_str());
}


1 0