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

来源:互联网 发布:angularjs.js 下载 编辑:程序博客网 时间:2024/06/13 02:38

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



一: 下载 JsonCpp 源码。


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

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

github链接:github-JsonCpp。


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

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

这里写图片描述

二: 编译 JsonCpp 源码。

-

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

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

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

这里写图片描述


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

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



一切配置OK之后。开始 生成 文件。
这里写图片描述

得到文件:

配置 文件名 说明 Release json_vc71_libmt.lib 实际项目中不同的 配置 则引用相应的 lib Debug json_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 &current = 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;}

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

如果你还碰到什么错误的话,欢迎来 我自己的一个 讨论群559666429来,大家一起找答案。
原创粉丝点击