C++ JSON解析之jsoncpp库的使用

C++ JSON解析之jsoncpp库的使用

1.介绍

轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据,层次结构简洁清晰,易于人阅读和编写,易于机器解析和生成。

2.语法规则

a.名称/值对的集合(对象、记录、结构、字典)
{}
b.值的有序列表(数组)
[]

数据在名称/值对中
数据由逗号分隔
大括号保存对象
中括号保存数组

值(value)可以是双引号括起来的字符串(string)、数值(number)truefalsenull、对象(object)或者数组(array)。
结构可以嵌套。

example:
{
	"action" : "run",
	"data" : 
	{
		"number" : 1
	}
}

3.数据解析

json文件的保存

  Json::Value root;
  Json::Value data;

  root["action"] = "run";
  data["number"] = 1;
  root["data"] = data;
  Json::StreamWriterBuilder builder;
  std::ofstream ofs;
  ofs.open("D:\\test.json");
  assert(ofs.is_open());
  builder.newStreamWriter()->write(root, &ofs);

json文件的读取

//方式一
  Json::Value root;
  std::ifstream ifs;
  ifs.open("D:\\test.json");

  Json::CharReaderBuilder builder;

  JSONCPP_STRING errs;
  if (!parseFromStream(builder, ifs, &root, &errs))
  {
    std::cout << errs << std::endl;
    return EXIT_FAILURE;
  }

  CString name = root["action"].asCString();
  int num = root["data"]["number"].asInt();
  cout << name << endl;
  cout << num << endl;
  return EXIT_SUCCESS;

//方式二
  Json::Value root;
  std::ifstream ifs;
  ifs.open("D:\\test.json");
  Json::Reader reader;

  if (reader.parse(ifs,root,false)) 
  {
     CString name = root["action"].asCString();
     int num = root["data"]["number"].asInt();
     cout << name << endl;
     cout << num << endl;
  }
  
  //!!!无法获取key值!!!
  //vector<string> Members;
 // Members = root.getMemberNames();

字符串的解析

  const std::string rawJson = R"({"Age": 20, "Name": "colin"})";
  const auto rawJsonLength = static_cast<int>(rawJson.length());
  JSONCPP_STRING err;
  Json::Value root;
  Json::CharReaderBuilder builder;
  const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
  if (!reader->parse(rawJson.c_str(), rawJson.c_str() + rawJsonLength, &root, &err))
  {
    std::cout << "error" << std::endl;
    return EXIT_FAILURE;
  }
  
  vector<string> Members;
  Members = root.getMemberNames();
  CString ss, temp;
  for (int m = 0; m < Members.size(); m++) {
    temp.Format("key=%s,Value=%s \n", Members[m].c_str(),
                root[Members[m]].asString());
    ss += temp;
  }

  MessageBoxA(NULL, ss, "Result", MB_OK);

判断key值是否存在

bool Json::Value::isMember ( const char * key) const

添加数据

        Json::Value data;
        data["value1"] = "111";
        data["value2"] = "222";
        data["value3"] = "333";
        root["Data"]=data;

删除数据

    if( root.isMember("Data"))
    {
      root.removeMember("Data");
    }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值