#include <iostream>
#include <string>
#include <sstream>
#include <jsoncpp/json/json.h>
using std::cout;
using std::endl;

/*使用json完成数据的序列化工作*/
std::string serialize()
{
    // 1. 将需要序列化的数据存储在Json::Value对象中
    Json::Value root;
    root["姓名"] = "小明";
    root["年龄"] = 18;
    root["成绩"].append(80);  //成绩是数组类型
    root["成绩"].append(90);
    root["成绩"].append(100);
    // 2. 实例化StreamWriterBuilder工厂类对象
    Json::StreamWriterBuilder swb;
    // 3. 使用StreamWriterBuilder工厂类对象实例化StreamWriter对象
    Json::StreamWriter *sw = swb.newStreamWriter();
    // 4. 使用StreamWriter对象完成Json::Value中数据的序列化工作，并将序列化结果存放到ss中
    std::stringstream ss;
    int n = sw->write(root, &ss);
    if(n != 0)
    {
        cout << "json serialize fail" << endl;
        delete sw;
        return "";  
    }
    
    delete sw;
    return ss.str();
}

/*使用Json完成序列化数据的反序列化工作*/
void deserialize(const std::string &str)
{
    // 1. 实例化一个CharReaderBuilder工厂类对象
    Json::CharReaderBuilder crb;
    // 2. 使用CharReaderBuilder对象实例化一个CharReader对象
    Json::CharReader *cr = crb.newCharReader();
    // 3. 创建一个Json::Value对象，用于保存json格式字符串反序列化后的结果
    Json::Value root;
    // 4. 使用CharReader对象完成json格式字符串的反序列化工作
    std::string errmsg;
    bool ret = cr->parse(str.c_str(), str.c_str() + str.size(), &root, &errmsg);
    if(ret == false)
    {
        cout << "json deserialize fail: " << errmsg << endl;
        delete cr;
        return;
    }
    // 5. 依次打印Json::Value中的数据
    cout << "姓名: " << root["姓名"].asString() << endl;
    cout << "年龄: " << root["年龄"].asInt() << endl; 
    int size = root["成绩"].size();
    for(int i = 0; i < size; i++)
    {
        cout << "成绩: " << root["成绩"][i].asFloat() << endl;
    }
}

int main()
{
    std::string str = serialize();
    cout << str << endl;
    deserialize(str);
    
    return 0;
}