文章目录
1.jsoncpp
2.jsoncpp基础操作
2.1 由basic value创建json value
2.2 由json value得到basic value
2.3 其他一些操作
3.序列化与反序列化(Serialization/Deserialization)
3.1 json value和string
3.2 json value和fstream
4.总结
1.jsoncpp
jsoncpp github地址
本文涵盖了日常编码中会用json库处理的大部分操作,如构造json对象、查找键值、序列化与反序列。
2.jsoncpp基础操作
2.1 由basic value创建json value
Json::Value basketballPlayer;
//1.添加基础数据
basketballPlayer["name"]="LeBorn Jame";//字符串
basketballPlayer["number"]=23;//整数
basketballPlayer["man"]=true;//布尔值
//2.添加数组元素,需要先定义一个数组类型的Json::Value
Json::Value children;
children[0]="LeBorn Jr";/*此处可能因为0能匹配int以及char*而报多个函数匹配的问题,可以
使用children.append("LeBorn Jr")代替*/
children[1]="Bryce Maximus";
children[2]="Zhuri";
//3.添加对象元素,需要先定义一个对象类型的Json::Value
Json::Value wife;
wife["name"] = "Savannah Brinson";
wife["man"] = false;
basketballPlayer["wife"] = wife;
2.2 由json value得到basic value
std::string name=basketballPlayer["name"].asString();//方式一
int number=basketballPlayer.get("number",23);//方式二,第二个参数是默认值
std::string childOne = basketballPlayer["children"][0].asString());//获取数组元素中的字段
std::string wifeName=basketballPlayer["wife"]["name"].asString();//获取对象元素中的字段
2.3 其他一些操作
//1.判断是有含有某个字段
if(basketballPlayer.isMember("name")){
std::cout<<"name:"<<basketballPlayer["name"].asString()<<std::endl;
}
//2.判断某个字段是否为某种类型
if(basketballPlayer["man"].type()==Json::booleanValue){
std::cout<<"man:"<<basketballPlayer["man"].asBool()<<std::endl;
}
//3.修改某个字段值
if(basketballPlayer.isMember("number")){
std::cout<<"number:"<<basketballPlayer["number"].asString()<<std::endl;
basketballPlayer["number"]=6;
std::cout<<"newNumber:"<<basketballPlayer["number"].asString()<<std::endl;
}
//4.操作数组元素
basketballPlayer["children"].append("Other Child");//添加元素
if (basketballPlayer["children"].isArray() && !basketballPlayer["children"].empty()) {
int childCount = basketballPlayer["children"].size();//获取数组数量
std::string childNameLast = basketballPlayer["children"][childCount-1].asString();
//获得最后一个元素
std::cout << "ChildNameLast:" << childNameLast << std::endl;
}
//5.操作对象元素
basketballPlayer["wife"]["children"] = basketballPlayer["children"];//给字段赋值
for (int i = 0; i < basketballPlayer["wife"]["children"].size(); ++i) {
std::cout << basketballPlayer["wife"]["children"][i].asString() << std::endl;
//遍历输出数组元素
}
for(int i=0;i<basketballPlayer.getMemberNames().size();++i){
//...遍历对象
}
3.序列化与反序列化(Serialization/Deserialization)
3.1 json value和string
//反序列化(Deserialization):Json::Reader的parse函数
std::string animalStr="{\"kind\":\"dog\",\"height\":50}";
Json::Value animalJson;
Json::Reader reader;
if(reader.parse(animalStr,animalJson)){
std::cout<<animalJson["kind"]<<std::endl;
}else{
std::cout<<"Parse failed:"<<reader.getFormatedErrorMessages()<<std::endl;
//通过getFormatedErrorMessages函数获取解析失败原因
}
/*序列化(Serialization):Value对象的toStyledString函数、FastWriter对象的write函数、StyledWriter
对象的writer函数,其中使用Value对象的toStyledString函数与StyledWriter对象的write函数获得的字符串
带有换行格式,而使用FastWriter对象的write函数获取得到的字符串则只有一行,不带换行格式*/
animalJson["kind"]="cat"//修改数据
std::string newAnimalStr=animalJson.toStyledString();//方式一:toStyledString
//newAnimalStr值为:
// {
// "kind":"cat",
// "height":50,
// }
Json::StyledWriter styledWriter;
newAnimalStr=styledWriter.write(animalJson);
//newAnimalStr值为:
// {
// "kind":"cat",
// "height":50,
// }
Json::FastWriter fastWriter;
newAnimalStr=fastWriter.write(animalJson);
//newAnimalStr值为: {"kind":"cat","height":50}
3.2 json value和fstream
//反序列化(Deserialization):Json::Reader的parse函数
std::ifstream in("animal.json");//打开文件,关联到流in
Json::Value animal;
Json::Reader reader;
if(reader.parse(in,animal)){
std::cout<<animal["kind"]<<std::endl;
}else{
std::cout<<"Parse failed:"<<reader.getFormatedErrorMessages()<<std::endl;
}
animals.at(0)["height"]=60;//修改数据
in.close();
//序列化(Serialization):StyledStreamWriter对象的write函数
std::ofstream out("animal.json");//打开文件,关联到流out
Json::StyledStreamWriter writer;
writer.write(out,animal);
out.close();
4.总结
jsoncpp经常会用到的几个对象:
Json::Reader: 用其parse函数将字符串(string)、文件流(ifstream)解析转成Json::Value对象。
Json::Value: 用来定义Json格式的基本对象,包含操作函数:isMember(std::string)、type()、append(Json::Value)、isArray()、isObject()、isDouble、empty()、size()、getMemberNames()等。
Json::FastWriter: 用其write函数将Json::Value对象序列化至string,没有执行换行格式化。
Json::StyledWriter: 用其write函数将Json::Value对象序列化至string,执行换行格式化。
Json::StyledStreamWriter: 用其write函数将Json::Value对象序列化至ofstream,执行换行格式化。
————————————————
版权声明:本文为CSDN博主「蜗牛单行道」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39568245/article/details/115498975