目录[-]


1、由诸多变量创建一个json对象

• 假设现在没有字符串,只有一些变量,其中便利定义如下:

string        tags= "grade";
string         teacherName = "boss";
int         classGrade  = 6;
string       studentsName[3] = {"zhang","wang","li"};
uint        studentsAge[3] = {5,6,7};
float       averagescore = 99.9;

• 现在需要将以上变量转化成Json对象,再进行序列化,以便于数据传输,其中变量转Json字符串的方法如下。

void serializeVariableToJson(){    
    Json::Value gradeJson_;
    Json::Value gradeJsonContent_;
    Json::Value studetsJsonContent_;
    //将信息标识填充至Json对象
    gradeJson_["tag"] = tags;
    //填充年级的信息
    gradeJsonContent_["teacher"] = teacherName;
    gradeJsonContent_["class"] = classGrade;
    //填充学生的信息
    studetsJsonContent_["name"]= studentsName[3];
    studetsJsonContent_["age"]= studentsAge[3];
    studetsJsonContent_["averagescore"]= averagescore;
    //将学生信息包含至年级信息下
    gradeJsonContent_["students"] = studetsJsonContent_;
    //将年级信息填充至Json对象
    gradeJson_["grade1"] = gradeJsonContent_;
}

• 此时gradeJson为包含所有信息的Json对象,将其打印出来,其值如下:

{
    "tag": "grade",
    "grade1":{
        "teacher": "Angle",
        "class": 6,
        "students": {
            "name":["zhang","wang","li"],
            "age": [5,6,7],
            "averagescore": 99.9 
        }
    }
}

2、提取Json格式的字符串中的值提取到诸多变量中

• 假设已经存在一个Json对象,此时需要将Json对象中的值提取到对应的变量中,假设Json对象如下:

Json::Value data = {
                "tag": "grade",
                "grade1":{
                    "teacher": "Angle",
                    "class": 6,
                    "students": {
                        "name":["zhang","wang","li"],
                        "age": [5,6,7],
                        "averagescore": 99.9 
                    }
                }
            }

• 现在需要将以上Json对象转化成变量,以便于程序使用,假设程序中已经有如下定义:

string        tags            = "";
string         teacherName     = "";
int         classGrade      = 0    ;
string       studentsName[3]    = {};
uint        studentsAge[3]    = {};
float       averagescore     = 0    ;

• 在此进行反序列化:

void deserializeJsonToVariable(){    
    Json::Reader reader_;
    Json::Value value_;
    if (reader_.parse(data, value_)){
        tags = value["tag"].asString();
        teacherName = value["grade1"]["teacher"].asString();
        classGrade = value["grade1"]["class"].asInt();
           for(int count_=0;count_<3;count_++){
            studentsName[count_]=value["grade1"]["students"]["name"][count_].asString();
            studentsAge[count_]=value["grade1"]["students"]["age"][count_].asInt();
        }
        averagescore = value["grade1"]["students"]["averagescore"].asDouble();
}

• 此时完成数据从Json到变量的附值,其值如下:

string        tags= "grade";
string         teacherName = "boss";
int         classGrade  = 6;
string       studentsName[3] = {"zhang","wang","li"};
uint        studentsAge[3] = {5,6,7};
float       averagescore = 99.9;

3、Json对象转string

• 假设此时已经有一个Json对象,需要将其进行序列化

Json::Value data = {
                "tag": "grade",
                "grade1":{
                    "teacher": "Angle",
                    "class": 6,
                    "students": {
                        "name":["zhang","wang","li"],
                        "age": [5,6,7],
                        "averagescore": 99.9 
                    }
                }
            }

• 其序列化步骤如下

std::string classString_ = json_content.toStyledString();

• jsoncpp在解析对象时,如果没有对应的key,则其会返回初始值。如下:此时仍定义一个Json变量

Json::Value data = {
                "tag": "grade",
                "grade1":{
                    "teacher": "Angle",
                    "class": 6,
                    "students": {
                        "name":["zhang","wang","li"],
                        "age": [5,6,7],
                        "averagescore": 99.9 
                    }
                }
            }

• 此时如果从此处取key = holiday,则由于Json对象中不存在key = holiday,则总会返回默认值值。

bool classIsHoliday_ = data["holiday"].asBool();

//此时jsoncpp并不会报错,但其会返回默认值false。即 classIsHoliday_ = false;

• 如果需要更改默认值,推荐如下用法,此时则由于Json对象中不存在key = holiday,则会返回默认值true。

bool classIsHoliday_ = data.get("holiday", true).asBool();

• 如果以错误的转化方式,去转化处理一个Json key,则Jsoncpp会异常退出。例如以下例子:

bool tags = data["tag"].asBool();

因此建议在处理Json对象前,先判断数据类型是否正确。比如在解析tag之前,可以这样处理,此时由于tag值类型并不是Bool类型,因此并不会转化,而是退出程序,这样做并不会引起程序崩溃异常。

if(data["tag"].isBool()){
    bool tags = data["tag"].asBool();
}else{
    return;    
}

4、测试输出

• 在测试过程中,支持直接将Json value 对象进行输出。

std::cout << data<<std::endl;