Jsoncpp: 所见即所得使用范例

林鹿 2019-10-14 19:35:17
原文地址:https://segmentfault.com/a/1190000020589447

jsoncpp版本: jsoncpp-1.8.4

基本操作

#include <json/json.h>

int main() {
  Json::Value root;

  root["key1"] = 1;
  root["key2"] = "good";
  root["indent"]["length"] = 2;
  root["indent"]["use_space"] = true;

  Json::Value v(Json::arrayValue);
  v[0] = "clojure";
  v[1] = "json";
  v[2] = "xml";
  root["key3"] = v;
  return 0;
}

遍历与类型

  for (auto i = root.begin(); i != root.end(); i++) {
    Json::Value& obj = *i;
    const std::string name = i.name();
    std::cout << name << "-" << i.key() << ": " << obj.isArray() << "\n";
  }

读入

  Json::Value root;
  std::ifstream infile;
  infile.open("your.json", std::ios::in);
  try {
    infile >> root;
  } catch (std::exception& e) {
    root = Json::objectValue;
  }
  infile.close();

这里用的是文件的读入流, 也可以是文本的stringstream

写出

  std::ofstream of;
  of.open("your.json", std::ios::out);
  of << root << std::endl;
  of.flush();
  of.close();

格式化输出

默认输出的json缩进是\t, 如果要改成2个空格:

  Json::StreamWriterBuilder builder;
  builder["indentation"] = "  ";
  builder.newStreamWriter()->write(root, &std::cout);

这里有个让人费解的地方:
void StreamWriterBuilder::setDefaults(Json::Value* settings)看起来似乎是让一个settings对象成为StreamWriterBuilder全局默认的配置, 但实际上只是让一个配置重置成'默认'数据, 真是莫名其妙的用法...

void StreamWriterBuilder::setDefaults(Json::Value* settings) {
  //! [StreamWriterBuilderDefaults]
  (*settings)["commentStyle"] = "All";
  (*settings)["indentation"] = "\t";
  (*settings)["enableYAMLCompatibility"] = false;
  (*settings)["dropNullPlaceholders"] = false;
  (*settings)["useSpecialFloats"] = false;
  (*settings)["precision"] = 17;
  (*settings)["precisionType"] = "significant";
  //! [StreamWriterBuilderDefaults]
}

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。