您的位置:首页 > 编程语言 > C语言/C++

C++ Json解析 之 JsonCpp的详细运用细节

2017-12-05 15:10 1216 查看

在开发C++ 服务器的时候。常常需要 解析 Json文件。然后,就使用了jsoncpp,没毛病。 他是比较出名的 C++ JSON 解析库。在 JSON官网也是首推的。 但在使用的过程中,也碰到各种问题和疑难杂症,在这里给大家分享一下详细过程。

一: 下载 JsonCpp 源码。

sourceforge链接sourceforge-Json 。 我此处使用的是这个。

[b]
sourceforge上的现在已经不更新,项目已经转移到GITHUB
[/b]

github链接github-JsonCpp

其中主要目录以及后面用途:

文件名Are
makefiles/vs71用于编译lib文件,方便你的项目去引用
makefiles/msvc2010
vs71
作用一样
include/json要用到的头文件,也要引用到你的项目之中
src/lib_jsonCpp 文件。如果不编译的话要使用


二: 编译 JsonCpp 源码。

-

编译前操作和注意事项:(编译工具:
VS2017中文


打开
项目
->
属性
:配置属性。

属性提示否则(使用时)
配置
Dubeg此处要和你的实际项目的版本一样error号:
002
常规
->
Window SDK版本
10.0.15063.0此处要和你的实际项目的版本一样error号:
001
常规
->
目标文件扩展名
&&
常规
->
配置类型
.liblib文件静态库 。你也可以做成
动态库.dll
。如果你使用方便
常规
->
平台工具集
Visual Studio 2017(v141)此处要和你的实际项目的版本一样不知
C/C++
->
代码生成
->
运行库
多线程调试(/MTD)此处要和你的实际项目的版本一样error号:
003
C/C++
->
预编译头
不使用预编译头)否则你会编译失败error号:
004


如果按照以上配置来设置项目属性的话。应该就可以编译了。 如果没有根据以上配置来。有可能编译后的 Lib 在你项目中使用的时候将报一下错误: 请根据错误号在上面配置列表中找错误!

error codeerror相关友情链接
001不好意思,我再次测试却没有出错。
002fatal error C1083:
de1a
无法打开编译器生成的文件: “../../build/vs71/release/lib_json\json_value.asm”: No such file or directory
003error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”(JsonCppTese.obj 中)不匹配解决方案
一切配置OK之后。开始 生成 文件。



得到文件:

配置文件名说明
Releasejson_vc71_libmt.lib实际项目中不同的 配置 则引用相应的 lib
Debugjson_vc71_libmtd.lib…………
友谊链接:相关问题

三: 在自己项目中引用头和库。

-

分别把:

1.
jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\
中的Json文件夹。

2. 编译得到的
json_vc71_libmt.lib
文件 复制到 你的项目根目录中。

3. 如果没有编译文件
json_vc71_libmt.lib
的话。还需要将
jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\src\lib_json
中的源码文件复制过来。

都复制到你的项目根目录。 然后分别引用他们去你的工程,相关教程链接在下面!!!!!!!!!

静态链接库和动态链接库的生成和引用

四: 解析你的Json文件。

注意: Json::Value 只能处理 ANSI 类型的字符串,如果 C++ 程序是用 Unicode 编码的,最好加一个 Adapt 类来适配。

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

Json文件:

[
{
"Name" : "MachineGun",
"WeaponAttribute": {
"ID": 105,
"AttackValue": 50,
"Defense": 0
}},

{
"Name" : "PlasmaGun",
"WeaponAttribute": {
"ID": 106,
"AttackValue": 5,
"Defense": 50
}}

]


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

#include "stdafx.h"
#include "json/json.h"
#include <fstream>
#include <cassert>

//using namespace std; // 如果fstream没有办法引用则需要这句

int a;
int main()
{
ifstream ifs;
ifs.open("WeaponConfiguration.json");
assert(ifs.is_open());

Json::Reader reader;
Json::Value root;
if (!reader.parse(ifs, root, false))
{
printf("Parse error");
return -1;
}

assert(root.isArray());

int size = root.size();

std::cout << size << std::endl;

for (int i = 0; i < size; i++)
{
Json::Value ¤t = root[i];

std::string name = root[i]["Name"].asString();
std::cout << name << std::endl;

Json::Value &attribute = root[i]["WeaponAttribute"];
int lenght = attribute.size();

int id = attribute["ID"].asInt();
int attackValue = attribute["AttackValue"].asInt();
int defense = attribute["Defense"].asInt();

std::cout << id << std::endl;
std::cout << attackValue << std::endl;
std::cout << defense << std::endl;
}

cin >> a;
return 0;
}


运行!成功输出!恭喜你!!

[b]如果你还碰到什么错误的话,欢迎来 我自己的一个 讨论群
559666429
来,大家一起找答案。
[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: