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
}
}