[C++]c++json库jsoncpp常用方法解析

序列化与反序列化

在处理json数据时,数据的序列化及反序列化是经常要使用的方法,下面详细介绍些jsoncpp关于序列化及反序列话的方法。

Json::Value node;
Json::Reader reader;
Json::FastWriter writer;
std::string str = "{\"name\":\"yang\", \"age\":10}";
//反序列化
reader.parse(str, node);//反序列化,将字符串转化为json格式的数据
//序列化
std::string str1 = node["name"].asString();//只能序列化json的object,不能带key值一起序列化。
std::string str1 = node.asString();//会出现段错误

str = node.toStyledString(); //序列化为带格式字符串,序列化整个接送对象

std::string str2 = writer.write(node);//序列化为不带格式的字符串

/*
注:toStyledString的序列化时带格式的字符换,如上面的str = node.toStyledString()输出的是:
{
    "age" : 10,
    "name" : "yang"
}
转化为字符字符串为:"{\n\"age\":10, \n\"name\":\"yang\"\n}"

str2 = writer.write(node);序列化的字符串就不带格式,序列化的结果为:{"age":10,"name":"yang"}

而str1 = node["name"].asString();输出不带格式的字符串,str1 = yang;
除了asString字符串格式的序列化,还有其他类型的序列化输出:
str1 = node["name"].asInt();    //序列化为int类型
str1 = node["name"].asFloat();    //序列化为浮点型
str1 = node["name"].asUint64();     //序列化为uint64_t类型
str1 = node["name"].asCString();    //序列化为const char *类型
str1 = node["name"].asString();    //序列化为std::string 类型
等;
*/

遍历

std::string jsonStr = "\"name\":\"yang\", \"age\":20";
Json::Reader reader; 
Json::Value value; 
reader.parse(jsonStr,value); 
Json::Value::Members member = value.getMemberNames(); 
for(Json::Value::Members::iterator iter = member.begin(); iter != member.end(); ++iter) 
{
    //获得key 
    cout << (*iter) << endl;
    //获取val
    std::cout << value[*iter] << std::endl; 
} 
//打印
name
age

OBJ类型

在处理json数据时,经常会需要确定json object的值类型,从而进行对应的处理,下面说一下json值怎么创建与判断!

//创建json某类型的值
Json::Value array = Json::Value(Json::arrayValue)//创建数组类型的obj
//除了数组类型还有以下类型:
Json::arrayValue    //数组
Json::intValue      //符号整型
Json::uintValue     //无符号整型
Json::nullValue     //空类型
Json::objectValue   //obj类型
Json::booleanValue  //bool类型
Json::stringValue   //string类型
//查询json某个key的值的类型,有json数据:Json::Value obj = "test" : {"age":10,"name":"yang"},加入不知道age值的类型,如下方式确定
//test值的类型就是obj类型接下来判断age
//方法1:
obj["test"]["age"].type()//获取age的值类型然后和json类型比较
if(obj["test"]["age"].type() == Json::booleanValue)
{
    std::cout << "age value type is bool" << std::endl;
}
//方法2
if(obj["test"]["age"].isInt())
{
    std::cout << "age type is int " << std::endl;
}

删除/修改

//有json数据:
Json::Value root = "{\"name\":\"yang\",\"age\":10}"
//修改age
root["age"] = 20;
//删除name
Json::Value root;
Json::Reader reader;
std::string str = "{\"name\":\"yang\",\"age\":10}";
reader.parse(str, root);//反序列化

std::cout << root.toStyledString() << std::endl;//打印字符串

Json::Value del;
 root.removeMember("name", &del);//删除成员
 //或者 root.removeMember("name");
 std::cout << root.toStyledString() << std::endl;

数组

创建数组

Json::Value root;
Json::Value mem1;
mem1["name"] = "yang";
root.append(mem1);//添加数组成员
Json::Value mem2;
mem2["age"] = 10;
root.append(mem2);

std::cout << root.toTypeString() << std::endl;

//结果
test 
[
    {
        "name" : "yang"
    },
    {
        "age" : 10,
    }
]

访问数组

test 
[
    {
        "name" : "yang"
    },
    {
        "name" : "zhao"
    }
]

//以上面test数组为例,访问age数组:
int val = test[1]["age"];
//因此可以这样遍历数组
for(int i = 0; i < test.size(); i++)
{
    std::cout << test[i]["name"].asString() << std::endl;
}

删除数组

test 
[
    {
    "name" : "yang",
    "age":10                            
    },
    {
     "name" : "zhao",
     "age":20
    }
]
//删除第一个元素
test.removeIndex(0,nullptr);

读写文件

读文件

//读文件
 std::ifstream ifs;
 ifs.open(file);
 if(ifs.is_open()){
     // 创建一个reader,将文件流解析成json对象root
     Json::Reader jsonReader;
     if(!jsonReader.parse(ifs, json, false)) {
         printf("jsonReader parse fail. file: %s\n", file.c_str());
         ifs.close();
         return -1;
     } 
     ifs.close();
     Json::StreamWriterBuilder builder;
     const std::string json_string = Json::writeString(builder, json);
     
     // 打印
     // std::cout << "\nload config file [" << file << "] :\n"<< json << std::endl;
     printf("load config file %s: \n%s\n", file.c_str(), json_string.c_str());
     return 0;
 }else{
     printf("can not load config file: %s\n", file.c_str());
 }

存文件

Json::StreamWriterBuilder w_builder;
const std::unique_ptr<Json::StreamWriter> writer(w_builder.newStreamWriter());
        
// 写入文件
std::ofstream ofs;
ofs.open(file);
if(ofs.is_open()){
    writer->write(json, &ofs);
    ofs.flush();
    ofs.close();
    return 0;
}
return -1;
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在C++中使用JsonCpp来读取JSON文件,你可以按照以下步骤进行操作: 1. 首先,确保已经下载并安装了JsonCpp,并将其包含在你的项目中。 2. 创建一个Json::Value对象来存储解析后的JSON数据。 3. 使用Json::Reader对象来读取JSON文件并解析Json::Value对象。 下面是一个简单的示例代码,演示了如何使用JsonCpp读取JSON文件: ```cpp #include <iostream> #include <fstream> #include <json/json.h> int main() { // 读取 JSON 文件 std::ifstream jsonFile("example.json"); if (!jsonFile.is_open()) { std::cout << "Failed to open JSON file." << std::endl; return 1; } // 解析 JSON 数据 Json::Value root; Json::Reader reader; if (!reader.parse(jsonFile, root)) { std::cout << "Failed to parse JSON data." << std::endl; return 1; } // 读取 JSON 数据并输出 std::string name = root["name"].asString(); int age = root["age"].asInt(); std::string city = root["city"].asString(); std::cout << "Name: " << name << std::endl; std::cout << "Age: " << age << std::endl; std::cout << "City: " << city << std::endl; return 0; } ``` 在上面的示例中,我们首先打开了一个名为`example.json`的JSON文件,然后使用JsonCppJson::Reader对象解析JSON数据,并将其存储在名为`root`的Json::Value对象中。接下来,我们通过访问`root`对象的键值对来获取JSON数据,并将其输出到控制台上。 请确保将示例代码中的`example.json`替换为你实际使用的JSON文件的路径。 这里提供一个CSDN上的相关教程供参考:[https://blog.csdn.net/qq_41453285/article/details/105808014](https://blog.csdn.net/qq_41453285/article/details/105808014)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FL1768317420

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值