POCO C ++对象到JSON字符串序列化

时间:2018-09-21 05:56:00

标签: c++ json serialization poco

我想知道如何使用POCO C ++库将具有其属性(例如名称,年龄)的给定类(例如Person)的对象序列化为JSON字符串。

也许我应该使用Poco :: Dynamic和Poco :: Dynamic :: Var创建模型才能使用POCO :: JSON :: Stringifier?我无法想象该怎么做...

谢谢!

2 个答案:

答案 0 :(得分:1)

与Java或C#不同,C ++在运行时类型信息(RTTI)之外没有自省/反射功能,后者具有不同的重点,并且仅限于多态对象。这意味着在非标准预编译器之外,您必须以一种或另一种方式告诉序列化框架对象的结构以及最终希望如何将其映射到int,{ {1}}和其他基本数据类型。我通常会区分三种不同的方法:预编译器,内联规范,属性转换。

  1. 预编译器:Google协议缓冲区:https://developers.google.com/protocol-buffers/docs/cpptutorial是预编译方法的一个很好的例子。您可以在单独的std::string文件中定义实体,该文件使用专有的编译器转换为.proto.c实体类。这些类可以像常规POCO实体一样使用,并且可以使用协议缓冲区序列化。

  2. 内联规范:Boost序列化(https://www.boost.org/doc/libs/1_67_0/libs/serialization/doc/index.html),s11n(www.s11n.net)和restc-cpp(https://github.com/jgaa/restc-cpp)是为POCO明确指定POCO结构的示例。您自己的代码中的框架。这样做的API多少有些复杂,但是其背后的原理始终是相同的:您为类提供了框架.h / serialise的实现,或者注册了允许该框架的元数据信息生成它们。下面的示例来自restc-cpp:

deserialise
  1. 属性转换:我不想错过的最后一种序列化是将显式转换为框架提供的中间数据类型。 Boost属性树(https://www.boost.org/doc/libs/1_67_0/doc/html/property_tree.html)和JsonCpp(http://open-source-parsers.github.io/jsoncpp-docs/doxygen/index.html)是这种方法的很好示例。您负责实现从您自己的类型到struct Post { int userId = 0; int id = 0; string title; string body; }; BOOST_FUSION_ADAPT_STRUCT( Post, (int, userId) (int, id) (string, title) (string, body) ) 的转换,Boost可以将其序列化为您喜欢的任何格式(XML,JSON)。

我在C ++中使用这三种方法都有自己的经验,我建议将选项3作为默认设置。似乎可以很好地映射到POCO C ++的JSON模型ptreeParser。一种选择是让您所有的实体POCO类都实现一个Varto_var函数,或者您可以将这些序列化函数保留在每个POCO类的不同命名空间中,这样您仅在以下情况下才需要包括它们:

如果您要处理的项目带有大量要序列化的对象(例如,通信库中的消息),则预编译器选项可能值得进行初始设置和增加构建复杂性,但这与往常一样取决于您正在处理的特定项目。

答案 1 :(得分:0)

请参阅https://stackoverflow.com/a/52738109/5845104

#include <x2struct.hpp>  // include this header file

struct Person {
    std::string name;
    int age;
    XTOSTRUCT(O(name, age));  // add XTOSTRUCT at the end of struct define
}

int main(int argc, char *argv[]) {
    Person p;
    p.name = "Jack";
    p.age = 30;
    std::string json_str = x2struct::X::tojson(e); // call tojson to convert object ot json string
    return 0
}