为了将JSON反序列化为c ++类,我使用的是使用RapidJSON的Cereal。正如所料,c ++ std :: string不能具有空值。但是其他平台确实支持字符串的null(.NET SQL等),我从它们获得JSON,字符串为空值。我需要容忍这一点,并为空值创建一个空字符串。最好的方法是什么?
我默认使用JSON上的字符串替换将空值更改为“”,如下所示,但它不是一个干净的解决方案。
#include <cereal/archives/json.hpp>
#include <boost/algorithm/string.hpp>
// i.e. substitue all ":null with ":"" Like {"key":null} into {"key":""}
boost::replace_all(json, "\":null", "\":\"\"");
auto r = std::make_shared<R>();
std::stringstream ss(json);
{
cereal::JSONInputArchive archive(ss);
r->serialize(archive);
}
如果有人根据Cereal生成的异常查找此答案,则为:“rapidjson内部断言失败:IsString()”
答案 0 :(得分:0)
在cereal-1.1.2 \ include \ cereal \ external \ rapidjson \ document.h中 改变这个
const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return data_.s.str; }
到这个
const Ch* GetString() const { if (IsNull_()) return ""; RAPIDJSON_ASSERT(IsString()); return data_.s.str; }
我不建议这应该在谷物来源中改变,因为有些人可能想要像原来那样进行严格的类型检查