两种风格的json如何解析更方便?------联合体哈希
(github有现成的json解析库;此文仅用于C++高级语法的学习)
json
{
"0x1": "a",
"0x2": "b",
"0x3": "c",
"0x4": {
"A": "d",
"B": "e"
},
"0x5": {
"A": "f",
"B": "g",
"C": "h"
},
"0x6": "i"
}
1. using ConfigNode= std::unordered_map<std::string, std::string>;
cpp
// 等价于:
typedef std::unordered_map<std::string, std::string> ConfigNode; // 旧式写法
2. using ConfigValue = std::variant<std::string, ConfigNode>;
定义另一个类型别名 ConfigValue,它代表 std::variant<std::string, SubConfig>。
std::variant是 C++17 引入的类型安全的联合体 (union)。它可以存储给定类型列表中的任意一种类型。- 这里
ConfigValue的对象要么存一个std::string,要么存一个SubConfig(即unordered_map)。不能同时存两者。
3. 为什么这样写?
在配置系统中,一个键对应的值可能有两种情况:
- 直接是简单字符串(如
"a") - 或者是包含多个子键值对的"子映射"(如
{"A":"d", "B":"e"})
std::variant 完美表达了这种"或"的关系,而 using 让代码意图更清晰。
4.如果json有多层嵌套
cpp
struct ConfigNode;
using ConfigValue = std::variant<std::string, std::unordered_map<std::string, std::shared_ptr<ConfigNode>>>;
struct ConfigNode {
ConfigValue value;
};