我正在尝试使用https://github.com/nlohmann/json序列化/反序列化std::map<int, MyObject>
这里说map的键必须能够生成std::string
,我该怎么做呢?
实现与我的自定义对象MyObject
之间的转换的基本用法如下:
using nlohmann::json;
namespace ns {
void to_json(json& j, const MyObject& p) {
j = json{{"name", p.name}, {"address", p.address}, {"age", p.age}};
}
void from_json(const json& j, MyObject& p) {
j.at("name").get_to(p.name);
j.at("address").get_to(p.address);
j.at("age").get_to(p.age);
}
} // namespace ns
但是我应该为Map做些什么呢?我最不想做的事情就是实现void to_json(json& j, const std::map<int, MyObject>& p)
和void from_json(const json& j, std::map<int, MyObject>& p)
。由于库已经支持std::map
,它应该为我做所有的事情,我只需要将int
转换为std::string
。我该怎么做呢?
2条答案
按热度按时间i86rm4rw1#
自述文件中的措辞很清楚地说明了为什么这不起作用(强调是我的):
同样,任何键-值关联容器......其键可以构造
std::string
,其值可以用于构造JSON值......都可以用于创建JSON对象。这就是为什么使用
int
作为键不适用于此库的原因;不能从int
构造std::string
。接下来的问题自然是“为什么”不允许这样做,这是你必须向图书馆的作者寻求明确答案的问题。
我们可以推测,这是因为没有一种方法可以将整数转换为字符串,也许假设没有前导零的以10为基的表示法是一个合理的选择,但没有令人信服的理由说明这一定是唯一的选择。
那么十六进制编码的字符串、科学记数法、千位分隔符或者其他任何可能的选项呢?
另一个可能的原因是,整数键建议使用稀疏数组,因此可能不清楚在输出中请求的是对象还是数组。
一个可能的解决方案是构建一个helper,通过在
std::to_string()
中运行键来将任何Map转换为std::map<std::string, TValue>
:zpgglvta2#
下面是一个通用的解决方案:为任意
std::map
定义to_json()
和from_json()
函数模板,如下所示:现在我们已经定义了一种将字符串值转换为Map的
key_type
(“反序列化”键)的方法,例如,可以使用from_string()
函数模板来实现,如下所示:有了这些函数,以及定制类型的
to
/from_json()
重载(来自原始问题),就可以用自然的方式在std::map
和JSON之间进行转换了: