如何从json字符串

时间:2018-02-16 00:29:15

标签: c++ json constructor factory

我想编写一个工厂方法,使用以下签名从json字符串(或xml字符串)构造C ++对象:

BaseClass * create_class_from_json(const std::string & json_str)

{

如果我传递以下json字符串,则该方法首先确定该类为Derived1并使用提供的参数调用该构造函数。

{
'class_name':'Derived1'
'param1':10
}

实现此目标的标准方法是在if上使用长class_name语句,并在不同情况下构造相应的类:

BaseClass * create_class_from_json(const std::string & json_str){
    std::string class_name = json::extract_field(json_str, 'class_name');
    if (class_name == 'Derived1')
    {
      int param1 = json::extract_field(json_str, 'param1')
      return new Derived1(param1);
    }
    else if (class_name == 'Derived2')...

}

在C ++中有更好/更优雅的方式吗?

2 个答案:

答案 0 :(得分:4)

没有直接的解决方案,但最近我看到了一个不错的article which can help you solve this in quite clever way

基本上你的工厂必须是一个单独的,并且创建的对象正在使用一个模板,该模板将每个类型注册到这个单例。

这与google test中的测试非常相似,后者在某些单例中自行注册。

请阅读文章了解更多详情。

答案 1 :(得分:2)

不,不是真的。 C ++没有反射。

但是,您可以将此作为构建过程中的预处理步骤, C ++之外的。让Python脚本在源文件中生成一些C ++对象声明,然后编译。