当前位置:   article > 正文

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

c++ jsoncpp

序列化与反序列化

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

  1. Json::Value node;
  2. Json::Reader reader;
  3. Json::FastWriter writer;
  4. std::string str = "{\"name\":\"yang\", \"age\":10}";
  5. //反序列化
  6. reader.parse(str, node);//反序列化,将字符串转化为json格式的数据
  7. //序列化
  8. std::string str1 = node["name"].asString();//只能序列化json的object,不能带key值一起序列化。
  9. std::string str1 = node.asString();//会出现段错误
  10. str = node.toStyledString(); //序列化为带格式字符串,序列化整个接送对象
  11. std::string str2 = writer.write(node);//序列化为不带格式的字符串
  12. /*
  13. 注:toStyledString的序列化时带格式的字符换,如上面的str = node.toStyledString()输出的是:
  14. {
  15. "age" : 10,
  16. "name" : "yang"
  17. }
  18. 转化为字符字符串为:"{\n\"age\":10, \n\"name\":\"yang\"\n}"
  19. str2 = writer.write(node);序列化的字符串就不带格式,序列化的结果为:{"age":10,"name":"yang"}
  20. 而str1 = node["name"].asString();输出不带格式的字符串,str1 = yang;
  21. 除了asString字符串格式的序列化,还有其他类型的序列化输出:
  22. str1 = node["name"].asInt(); //序列化为int类型
  23. str1 = node["name"].asFloat(); //序列化为浮点型
  24. str1 = node["name"].asUint64(); //序列化为uint64_t类型
  25. str1 = node["name"].asCString(); //序列化为const char *类型
  26. str1 = node["name"].asString(); //序列化为std::string 类型
  27. 等;
  28. */

遍历

  1. std::string jsonStr = "\"name\":\"yang\", \"age\":20";
  2. Json::Reader reader;
  3. Json::Value value;
  4. reader.parse(jsonStr,value);
  5. Json::Value::Members member = value.getMemberNames();
  6. for(Json::Value::Members::iterator iter = member.begin(); iter != member.end(); ++iter)
  7. {
  8. //获得key
  9. cout << (*iter) << endl;
  10. //获取val
  11. std::cout << value[*iter] << std::endl;
  12. }
  13. //打印
  14. name
  15. age

OBJ类型

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

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

删除/修改

  1. //有json数据:
  2. Json::Value root = "{\"name\":\"yang\",\"age\":10}"
  3. //修改age
  4. root["age"] = 20;
  5. //删除name
  6. Json::Value root;
  7. Json::Reader reader;
  8. std::string str = "{\"name\":\"yang\",\"age\":10}";
  9. reader.parse(str, root);//反序列化
  10. std::cout << root.toStyledString() << std::endl;//打印字符串
  11. Json::Value del;
  12. root.removeMember("name", &del);//删除成员
  13. //或者 root.removeMember("name");
  14. std::cout << root.toStyledString() << std::endl;

数组

创建数组

  1. Json::Value root;
  2. Json::Value mem1;
  3. mem1["name"] = "yang";
  4. root.append(mem1);//添加数组成员
  5. Json::Value mem2;
  6. mem2["age"] = 10;
  7. root.append(mem2);
  8. std::cout << root.toTypeString() << std::endl;
  9. //结果
  10. test
  11. [
  12. {
  13. "name" : "yang"
  14. },
  15. {
  16. "age" : 10,
  17. }
  18. ]

访问数组

  1. test
  2. [
  3. {
  4. "name" : "yang"
  5. },
  6. {
  7. "name" : "zhao"
  8. }
  9. ]
  10. //以上面test数组为例,访问age数组:
  11. int val = test[1]["age"];
  12. //因此可以这样遍历数组
  13. for(int i = 0; i < test.size(); i++)
  14. {
  15. std::cout << test[i]["name"].asString() << std::endl;
  16. }

删除数组

  1. test
  2. [
  3. {
  4. "name" : "yang",
  5. "age":10
  6. },
  7. {
  8. "name" : "zhao",
  9. "age":20
  10. }
  11. ]
  12. //删除第一个元素
  13. test.removeIndex(0,nullptr);

读写文件

读文件

  1. //读文件
  2. std::ifstream ifs;
  3. ifs.open(file);
  4. if(ifs.is_open()){
  5. // 创建一个reader,将文件流解析成json对象root
  6. Json::Reader jsonReader;
  7. if(!jsonReader.parse(ifs, json, false)) {
  8. printf("jsonReader parse fail. file: %s\n", file.c_str());
  9. ifs.close();
  10. return -1;
  11. }
  12. ifs.close();
  13. Json::StreamWriterBuilder builder;
  14. const std::string json_string = Json::writeString(builder, json);
  15. // 打印
  16. // std::cout << "\nload config file [" << file << "] :\n"<< json << std::endl;
  17. printf("load config file %s: \n%s\n", file.c_str(), json_string.c_str());
  18. return 0;
  19. }else{
  20. printf("can not load config file: %s\n", file.c_str());
  21. }

存文件

  1. Json::StreamWriterBuilder w_builder;
  2. const std::unique_ptr<Json::StreamWriter> writer(w_builder.newStreamWriter());
  3. // 写入文件
  4. std::ofstream ofs;
  5. ofs.open(file);
  6. if(ofs.is_open()){
  7. writer->write(json, &ofs);
  8. ofs.flush();
  9. ofs.close();
  10. return 0;
  11. }
  12. return -1;
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/595718
推荐阅读
相关标签
  

闽ICP备14008679号