cjson
cjson是一个用于解析json格式数据的C开源库。
jsoncpp
jsoncpp是用于解析json格式数据的C++开源库。地址:https://github.com/open-source-parsers/jsoncpp/tree/update
1.环境配置
- 在Linux环境下,项目中使用jsoncpp,需要进行一些配置。首先下载jsoncpp源码。
- 根据README.md文件的提示,生成静态库libjsoncpp.a
mkdir -p build/debug
cd build/debug
cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF -DARCHIVE_INSTALL_DIR=. -G "Unix Makefiles" ../..
make
- 拷贝头文件与静态库到/usr/local下
# 头文件位于/jsoncpp/include/json目录下,将其拷贝到/usr/local/include目录下
cp include/json /usr/local/include -r
# libjsoncpp.a位于/jsoncpp/build/debug/lib目录下
cp libjsoncpp.a /usr/local/lib
- 在执行编译的时候需要连接静态库
# -L指定包含的库路径
# -l指定包含的库名称,库名称掐头去尾
-L /usr/local/lib -l jsoncpp
2.jsoncpp的使用
- jsoncpp库中的类被定义到了Json命名空间,因此使用这个库的时候需要声明这个命名空间。
using namespace Json;
- 重要的三个类:
- Value 类:将 json 支持的数据类型进行了包装,最终得到一个 Value 类型
enum ValueType { nullValue = 0, ///< 'null' value intValue, ///< signed integer value uintValue, ///< unsigned integer value realValue, ///< double value stringValue, ///< UTF-8 string value booleanValue, ///< bool value arrayValue, ///< array value (ordered list),即json串中的[] objectValue ///< object value (collection of name/value pairs). 即json串中的{} };
- FastWriter类:将 Value 对象中的数据序列化为字符串
- Reader类:反序列化,将 json 字符串 解析成 Value 类型
- 将数据序列化为json字符串
- 使用Value对象的toStyledString方法:序列化得到的字符串有样式,带换行
- 使用FastWriter类的write方法,序列化后的字符串单行显示
- 反序列化:使用Reader类的方法
bool Json::Reader::parse(const std::string& document,
Value& root, bool collectComments = true);
函数参数:
- document: json格式字符串
- root: 传出参数, 存储了json字符串中解析出的数据
- collectComments: 是否保存json字符串中的注释信息
// 通过begindoc和enddoc指针定位一个json字符串
bool Json::Reader::parse(const char* beginDoc, const char* endDoc,
Value& root, bool collectComments = true);
// 从保存json数据的输入流中解析
bool Json::Reader::parse(std::istream& is, Value& root, bool collectComments = true);
- 示例:将一个json数组保存到文件中
// json数组为:
[
{
"address": "浙江省杭州市",
"school": "家里蹲大学",
"personInfo" : [{
"gender": "男",
"age": 23,
"name": "张三"
}]
}
]
#include <json/json.h>
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
Json::Value root, subObj, subsubArr, subsubObj;
// 对象类型
subsubObj["gender"] = "男";
subsubObj["age"] = 23;
subsubObj["name"] = "张三";
// 数组添加对象
subsubArr.append(subsubObj);
// 对象类型
subObj["address"] = "浙江省杭州市";
subObj["school"] = "家里蹲大学";
subObj["personInfo"] = Json::Value(subsubArr);
// 数组添加对象
root.append(subObj);
// 带换行
string str = root.toStyledString();
// 一行显示
// Json::FastWriter writer;
// cout << writer.write(root) << endl;
// 将序列化后的字符串保存到文件
ofstream ostream("data.json");
ostream << str;
return 0;
}
- 示例:从后缀名为.json的文件解析json字符串
#include <iostream>
#include <json/json.h>
#include <fstream>
using namespace std;
int main() {
ifstream ifs("data.json");
Json::Reader reader;
Json::Value root;
reader.parse(ifs, root);
for (int i = 0; i < root.size(); ++i) {
// 取出数组中的各个元素,类型是Value
Json::Value item = root[i];
// 得到所有的key
Json::Value::Members keys = item.getMemberNames();
for (int j = 0; j < keys.size(); ++j) {
if (item[keys[j]].isArray()) {
// 取出数组中的各个元素,类型是Value
for (int k = 0; k < item[keys[j]].size(); ++k) {
Json::Value temp = item[keys[j]][k];
Json::Value::Members keys = temp.getMemberNames();
for (int z = 0; z < keys.size(); ++z) {
cout << keys.at(z) << ":" << temp[keys[z]] << ",";
}
cout << endl;
}
} else {
cout << keys.at(j) << ":" << item[keys[j]] << ",";
}
}
cout << endl;
}
return 0;
}
// g++ deserialize.cpp -L /usr/local/lib -l jsoncpp