1. 下载安装JsonCpp
打开vs2017,新建一个空项目,项目名称随意.
依次点击 工具->NuGet包管理器(N) ->程序包管理控制台,输入以下命令. Install-Package jsoncpp-vc140-static-32_64, 输入完成之后按下回车键.OK,到这一步,JsonCpp已经安装完成了. 是不是非常方便. 如果有不习惯使用命令行的同学,可以直接使用界面的方式.
下载完成之后,我们可以看到项目的资源文件中会出现packages.config文件.项目文件夹中也会出现一个packages的文件夹. 用脚指头都可以想到文件夹下面是下载好的JsonCpp,好吧. 现在我们什么配置都不要去做. 直接在需要使用的文件下面添加
#include <json/json.h>
这行代码就可以使用了. 是不是觉得比网上那些从github上 下载下来之后编译,配置,最后使用的过程简单,快捷,高大上很多?
2.使用JsonCpp
好吧,直接上代码.
<1>.test.json文件,这个是我写的一个音乐播放器的测试Json文件,不知道啥原因,在使用Qt5来解析的时候这里是不需要unicode转码的. 不过没关系, 用C++写俩函数做转换也是方便的很,扯得有点远了. 这里只是让大家注意一下字符编码的问题.
{
"dis_del":"\u9ed8\u8ba4\u5217\u8868\u000d\u000a",
"\u9ed8\u8ba4\u5217\u8868\u000d\u000a":[
{"name":"Hold不住的爱","path":"music","love_flag":true,"lyric":false},
{"name":"最右","path":"music","love_flag":true,"lyric":false},
{"name":"就是让你美","path":"music","love_flag":true,"lyric":false}
],
"\u6211\u6700\u559c\u6b22\u000d\u000a":[
{"name":"想你啦","path":"music","love_flag":true,"lyric":false},
{"name":"漂亮的姑娘就要嫁人啦","path":"music","love_flag":true,"lyric":false},
{"name":"雨的眼泪在海兴里","path":"music","love_flag":true,"lyric":false}
]
}
<2>代码
#include <iostream>
#include <string>
#include <fstream>
#include <Windows.h>
#include <json/json.h>
using namespace std;
typedef Json::Reader JsonReader;
typedef Json::Writer JsonWriter;
typedef Json::Value JsonValue;
typedef Json::Value::Members JsonMembers;
void writeJson()
{
JsonValue root;
JsonValue item1;
item1["name"] = "dog";
item1["age"] = 15;
JsonValue item2;
item2["name"] = "cat";
item2["age"] = 20;
JsonValue array;
array.append(item1);
array.append(item2);
root["animals"] = array;
JsonMembers members = root.getMemberNames();
for (auto iter = members.begin(); iter != members.end(); ++iter)
{
auto key = *iter;
if (root[key.c_str()].isObject())
{
}
else if (root[key.c_str()].isArray())
{
for (int i = 0; i < root["animals"].size(); ++i)
{
auto ret = root["animals"][i]["name"].asString();
if (!ret.compare(std::string("dog")))
{
root["animals"][i]["name"] = "hahha";
}
}
}
}
ofstream ofs;
ofs.open("test2.json");
ofs << root.toStyledString();
}
int main(int argc, char* argv[])
{
std::ifstream ifs("test.json");
JsonReader reader;
JsonValue root;
if (!reader.parse(ifs, root, false))
{
std::cout << "prase failed!!!" << std::endl;
return -1;
}
JsonMembers members = root.getMemberNames();
for (auto iter = members.begin(); iter != members.end(); ++iter)
{
auto strKey = *iter;
if (root[strKey.c_str()].isString())
{
auto strVal = root[strKey.c_str()].asString();
std::cout << strKey.c_str() << ":" << strVal.c_str() << std::endl;
}
else if (root[strKey.c_str()].isInt())
{
auto iVal = root[strKey.c_str()].asInt();
std::cout << strKey.c_str() << ":" << iVal << std::endl;
}
else if (root[strKey.c_str()].isDouble())
{
auto dVal = root[strKey.c_str()].asDouble();
std::cout << strKey.c_str() << ":" << dVal << std::endl;
}
else
{
auto strVal = root[strKey.c_str()].toStyledString();
std::cout << strKey.c_str() << ":" << strVal.c_str() << std::endl;
}
}
system("pause");
return 0;
}
<3> 运行截图