是否可以使用Boost.Hana进行反序列化?
Is it possible to deserialize using Boost.Hana?
我开始使用Boost。我想知道是否有一种方法可以反序列化回一个Boost.Hana已知的Struct。例如,我知道将这样的Struct序列化为json字符串非常简单,但我没有找到有关其他方式的任何信息。是否目前无法使用Boost对数据进行反序列化?汉娜,还是我错过了什么?
Hana是一个元编程库。它提供了可用于构建的工具更复杂的功能,如序列化,但它不提供这样的功能本身。它根本不在那个库的范围之内。另外,关于您的特定用例;解析不是一个简单的问题和其他库喜欢刺激。精灵号已经试着解决了
话虽这么说,我概述了一个使用Hana反序列化JSON的示例。结果既不有效也不健壮,但它应该足以给出让您了解一下如何使用Hana来实现更好的目标。解决正确地解决这个问题需要实现一个解析器组合器库像提振。精神,这里我就不讲了。给你:
template <typename T>
std::enable_if_t<std::is_same<T, int>::value,
T> from_json(std::istream& in) {
T result;
in >> result;
return result;
}
template <typename T>
std::enable_if_t<std::is_same<T, std::string>::value,
T> from_json(std::istream& in) {
char quote;
in >> quote;
T result;
char c;
while (in.get(c) && c != '"') {
result += c;
}
return result;
}
template <typename T>
std::enable_if_t<hana::Struct<T>::value,
T> from_json(std::istream& in) {
T result;
char brace;
in >> brace;
hana::for_each(hana::keys(result), [&](auto key) {
in.ignore(std::numeric_limits<std::streamsize>::max(), ':');
auto& member = hana::at_key(result, key);
using Member = std::remove_reference_t<decltype(member)>;
member = from_json<Member>(in);
});
in >> brace;
return result;
}
template <typename Xs>
std::enable_if_t<hana::Sequence<Xs>::value,
Xs> from_json(std::istream& in) {
Xs result;
char bracket;
in >> bracket;
hana::length(result).times.with_index([&](auto i) {
if (i != 0u) {
char comma;
in >> comma;
}
auto& element = hana::at(result, i);
using Element = std::remove_reference_t<decltype(element)>;
element = from_json<Element>(in);
});
in >> bracket;
return result;
}
然后你可以用
struct Car {
BOOST_HANA_DEFINE_STRUCT(Car,
(std::string, brand),
(std::string, model)
);
};
struct Person {
BOOST_HANA_DEFINE_STRUCT(Person,
(std::string, name),
(std::string, last_name),
(int, age)
);
};
int main() {
std::istringstream json(R"EOS(
[
{
"name": "John",
"last_name": "Doe",
"age": 30
},
{
"brand": "BMW",
"model": "Z3"
},
{
"brand": "Audi",
"model": "A4"
}
]
)EOS");
auto actual = from_json<hana::tuple<Person, Car, Car>>(json);
auto expected = hana::make_tuple(Person{"John", "Doe", 30},
Car{"BMW", "Z3"},
Car{"Audi", "A4"});
assert(actual == expected);
}
boost::hana json编码器不完整(例如,它不转义引号):http://www.boost.org/doc/libs/1_61_0/libs/hana/doc/html/index.html#tutorial-introspection-json
要反序列化,我会使用boost::spirit::x3: http://ciere.com/cppnow15/x3_docs/index.html
他们有一个json反序列化的例子:https://github.com/cierelabs/json_spirit
相关文章:
- 如何知道QDataStream不能反序列化某些内容
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 如何反序列化数组?
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 通过 tcp 发送 C# 类并在 C++ 上反序列化
- 序列化和反序列化boost共享指针
- 在C++中使用POCO和grain对多个对象进行反序列化
- C++中整数向量的序列化/反序列化
- 使用 Json 转换器反序列化 WCF 服务中的C++字符串
- 使用 QDataStream 对原始数据进行反序列化
- 使用协议缓冲区创建通用反序列化程序
- 如何在C++中从头开始反序列化文件(没有库)
- 在协议缓冲区 c++ 中反序列化字符串数组
- 在进程的内存中序列化/反序列化
- 谷物/C++ 11 - 如何指定反序列化的可选参数
- 是否可以反序列化(从原始内存块)没有默认构造函数的对象?
- 如何从平面缓冲区中反序列化联合结构的 void* 值的大小
- 是否可以使用Boost.Hana进行反序列化?