Jsoncpp编译环境配置
1. 下载Jsoncpp最新源码,不同版本配置可能有细微区别,作者使用的是jsoncpp-0.10.2(https://github.com/open-source-parsers/jsoncpp/releases);
2. 在vs中打开源码工程(如F:\devlib\jsoncpp-0.10.2\makefiles\msvc2010),选择对应的开发模式Debug或Release,生成解决方案,就会生成相应的库;
3. 新建工程,选择属性àc/c++à附加包含目录,填上Json库include目录路径(如F:\devlib\jsoncpp-0.10.2\include),选择连接器à附加库目录,填上步骤2中生成的库目录(如F:\devlib\jsoncpp-0.10.2\makefiles\msvc2010\Debug),选择连接器à输入à附加依赖项,填上步骤2中生成的库名(如lib_json.lib),特别需要注意的是要把c/c++à代码生成à运行库的模式调成跟原Json工程中一致(如多线程调试/MTd)。
Jsoncpp基本用法说明
Json元素类型大概分3类:数组、json::Value对象、其他(int、string、double、bool、null等),如下Json窜:
{"array":[1,2,3],"boolean":true,"null":null,"int":123,"double":11.222,"object":{"a":"A","b":"B","v":"C"},"string":"你好"}
Jsoncpp中关键的类有3种Value、Reader、Writer的子类FastWriter与StyledWriter,Value类中有一个重要的重定义类型为Members(typedef std::vector<std::string> Members),可以用其迭代器访问元素,注意此类型只对Json::Value生效,不能作用于数组。Reader类主要提供了prase()方法用于反序列化数据,Writer子类主要提供了write()方法用于序列化数据。(特别要注意数组与Json::Value的区别,为这作者就没吃上午饭)
简单代码举例
#include <iostream>
#include <string>
#include <cassert>
#include "json/json.h"
using namespace std;
static void printValueTree(Json::Value& value, char* name="")
{
if (Json::objectValue == value.type())
{
Json::Value::Members members(value.getMemberNames());
Json::Value::Members::iterator it = members.begin();
for (; it != members.end(); ++it)
{
name = (char*)(*it).c_str();
printValueTree(value[name], name);
}
}
else if (Json::arrayValue == value.type())
{
cout << name << ":" << value << endl;
}
else
{
cout << name << ":" << value << endl;
}
}
bool readJson(const string &str)
{
if (str.empty())
{
return false;
}
Json::Reader reader;
Json::Value value;
if (!reader.parse(str, value))
{
return false;
}
printValueTree(value);
}
void writeJson(const string &str)
{
Json::Value value;
value["array"].append(1);
value["array"].append(2);
value["array"].append(3);
value["boolean"] = true;
value["null"];
value["int"] = 123;
value["double"] = 11.222;
value["object"]["a"] = "A";
value["object"]["b"] = "B";
value["object"]["c"] = "C";
value["string"] = "你好";
Json::FastWriter fWriter;
Json::StyledWriter sWriter;
cout << "原数据:" << endl;
cout << str << endl;
cout << "快速写数据:" << endl;
cout << fWriter.write(value) << endl;
cout << "带样式数据:" << endl;
cout << sWriter.write(value) << endl;
}
int main()
{
string strValue1 = "{\"array\":[1,2,3],\"boolean\":true,\"null\":null,\"int\":123,\"double\":11.222,\"object\":{\"a\":\"A\",\"b\":\"B\",\"c\":\"C\"},\"string\":\"你好\"}";
writeJson(strValue1);
readJson(strValue1);
return 0;
}
运行结果:
问题来了:原数据与快速写数据元素顺序不一样,而带样式数据元素顺序相同。