• jsoncpp使用


    文章目录
    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

  • 相关阅读:
    dotnet OpenXML 解析 PPT 图表 面积图入门
    dotnet 读 WPF 源代码笔记 WPF 是如何做到一套代码兼容多个 .NET Framework 版本
    FileStream 的 FlushAsync 方法在 .NET Framework 与 .NET Core 行为的不同
    dotnet 开启 Fiddler 抓包将会让请求 HOST 头被更改
    查找算法find自定义数据类型
    算数仿函数相加
    查找算法adjacent_find相邻重复元素
    逻辑仿函数非
    关系仿函数大于
    查找算法find_if自定义数据类型
  • 原文地址:https://www.cnblogs.com/lidabo/p/16093431.html
Copyright © 2020-2023  润新知