目录[-]
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;