接受使用rapidjson在谷物中的字符串的空值,使它们成为“”

时间:2016-06-14 15:06:47

标签: c++ json rapidjson cereal

为了将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()”

1 个答案:

答案 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; }

我不建议这应该在谷物来源中改变,因为有些人可能想要像原来那样进行严格的类型检查