Принимайте нулевые значения для строк с Rapidjson внутри хлопьев, сделайте их

Для десериализации JSON в класс C ++ я использую 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: IsString ()»


person Yaniv    schedule 14.06.2016    source источник


Ответы (1)


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

Я не предлагаю изменить это в источнике хлопьев, потому что некоторым людям может потребоваться строгая проверка типов, как в оригинале.

person Yaniv    schedule 16.06.2016