cjson

cjson是一个用于解析json格式数据的C开源库。

jsoncpp

jsoncpp是用于解析json格式数据的C++开源库。地址:https://github.com/open-source-parsers/jsoncpp/tree/update

1.环境配置
  1. 在Linux环境下,项目中使用jsoncpp,需要进行一些配置。首先下载jsoncpp源码。
  2. 根据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
  1. 拷贝头文件与静态库到/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
  1. 在执行编译的时候需要连接静态库
# -L指定包含的库路径
# -l指定包含的库名称,库名称掐头去尾
 -L /usr/local/lib  -l jsoncpp
2.jsoncpp的使用
  1. jsoncpp库中的类被定义到了Json命名空间,因此使用这个库的时候需要声明这个命名空间。
using namespace Json;
  1. 重要的三个类:
    1. 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串中的{}
    };
    
    1. FastWriter类:将 Value 对象中的数据序列化为字符串
    2. Reader类:反序列化,将 json 字符串 解析成 Value 类型
  2. 将数据序列化为json字符串
    1. 使用Value对象的toStyledString方法:序列化得到的字符串有样式,带换行
    2. 使用FastWriter类的write方法,序列化后的字符串单行显示
  3. 反序列化:使用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);
  1. 示例:将一个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;
}

  1. 示例:从后缀名为.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