接受带有谷物内部 rapidjson 的字符串的空值,使它们成为“”

Accept null values for strings with rapidjson inside cereal, make them ""

为了将 JSON 反序列化为 c++ class,我使用的是 Cereal,它使用 RapidJSON。正如预期的那样,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 internal assertion failure: IsString()"

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

我不建议在谷物源中更改此设置,因为有些人可能希望像原来那样进行严格的类型检查