接受带有谷物内部 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; }
我不建议在谷物源中更改此设置,因为有些人可能希望像原来那样进行严格的类型检查
为了将 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; }
我不建议在谷物源中更改此设置,因为有些人可能希望像原来那样进行严格的类型检查