C++ 读取JSON配置文件

前言

JSON作为当下流行的数据交换语言,其易于人阅读和编写,易于机器解析和生成,以及高效的网络传输效率等特性,使其再互联网、物联网等行业得到了广泛的使用,使用JSON作为配置文件的项目也是多不胜数(不过C++好像少一点),笔者正好最近在做物联网相关的项目,在学着使用JSON,索性就先用JSON做一下自己项目的配置文件。

JSON 库的选择

进入JSON官网或者直接在github上搜索,都可以找到大量的JSON库,笔者今天选择的是人气最旺 nlohmann/json,由于配置文件对速度和内存没有特殊的要求,所以主要考虑的就是易用性了。

github地址:github.com/nlohmann/json

开发环境

由于 nlohmann/json 使用 C++ 11,所以要支持C++ 11 的开发环境,引用官方文档:

Though it's 2019 already, the support for C++11 is still a bit sparse. Currently, the following compilers are known to work:

  • GCC 4.8 - 9.0 (and possibly later)
  • Clang 3.4 - 8.0 (and possibly later)
  • Intel C++ Compiler 17.0.2 (and possibly later)
  • Microsoft Visual C++ 2015 / Build Tools 14.0.25123.0 (and possibly later)
  • Microsoft Visual C++ 2017 / Build Tools 15.5.180.51428 (and possibly later)

笔者公司的电脑是 Visual C++ 2015,编译 examples 是编译不过的,应该是编译工具版本导致的,改天再研究。今天笔者用的是自己家里的电脑,开发环境是 Microsoft Visual C++ 2017

示例代码

// #include "pch.h"
#include <iostream>
#include "nlohmann/json.hpp"    // https://github.com/nlohmann/json/tree/develop/single_include/nlohmann/json.hpp
#include <fstream>              // ifstream, ofstream
#include <iomanip>              // std::setw()

using json = nlohmann::json;

int main()
{
	// 从文件读取配置
	std::ifstream fin("config.json");   // 注意此处是相对路径
	json j;
	fin >> j;
	fin.close();

	// 检查读取的和预期的是否一致
	std::cout << j["pi"]						<< std::endl;	// 3.141
	std::cout << j["happy"]						<< std::endl;	// true
	std::cout << j["name"]						<< std::endl;	// "Niels"
	std::cout << j["nothing"]					<< std::endl;	// null
	std::cout << j["answer"]["everything"]		<< std::endl;	// 42
	std::cout << j["list"]						<< std::endl;	// [1, 0, 2]
	std::cout << j["object"]					<< std::endl;	// { "currency":"USD","value" : 42.99 }

	// 写入文件
	std::ofstream fout("object.json");  // 注意 object.json 和 config.json 内容一致,但是顺序不同
	fout << std::setw(4) << j << std::endl;
	fout.close();

	// 注意:
	// JSON标准将对象定义为“零个或多个名称 / 值对的无序集合”。
	// 如果希望保留插入顺序,可以使用tsl::ordered_map(integration)或nlohmann::fifo_map(integration)等容器专门化对象类型。

	getchar();
}

配置文件

config.json

{
  "pi": 3.141,
  "happy": true,
  "name": "Niels",
  "nothing": null,
  "answer": {
    "everything": 42
  },
  "list": [ 1, 0, 2 ],
  "object": {
    "currency": "USD",
    "value": 42.99
  }
}
03-17 11:47