将 C 类转换为 JSON

新手上路,请多包涵

我想创建一个包含我的类的实例变量的 JSON 字符串。

例如,

 class Example {
    std::string string;
    std::map<std::string, std:string> map;
    std::vector<int> vector;
};

会成为:

 {
    "string":"the-string-value",
    "map": {
        "key1":"val1",
        "key2":"val2"
    },
    "vector":[1,2,3,4]
}

我研究了几个用于创建 JSON 的 C++ 库,它们看起来都非常复杂。我想要类似于 Javascript 的 JSON.stringify(object) 的东西。换句话说,只需将 std::map 传递给它并接收一个字符串。该映射可以包含其他映射、向量、列表、字符串、数字和布尔值。

最好的方法是什么?

谢谢你的帮助。

编辑

我研究了以下内容:

json精神,jsoncpp,zoolib,JOST,CAJUN,libjson,nosjob,JsonBox,jsonme–

我知道我可以在下面的答案中构造一个单独的 JSON 对象并转换为 JSON 我希望能够将我的东西存储在标准集合中并进行转换。

编辑 2

好的,放弃序列化类的想法,因为 C++ 缺乏反射似乎是不可能的。

有没有一种很好的方法可以将包含 std:maps、std::vectors、std::lists、数字、字符串和布尔值的 std::map 转换为 JSON,而无需更改数据类型或将数据复制到新的数据类型?

谢谢。

原文由 tgt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

JSON Spirit 将允许您这样做:

 Object addr_obj;

addr_obj.push_back( Pair( "house_number", 42 ) );
addr_obj.push_back( Pair( "road",         "East Street" ) );
addr_obj.push_back( Pair( "town",         "Newtown" ) );

ofstream os( "address.txt" );
os.write( addr_obj, os, pretty_print );
os.close();

输出:

 {
    "house_number" : 42,
    "road" : "East Street",
    "town" : "Newtown"
}

我想 json_map_demo.cpp 将是一个不错的起点。

原文由 sehe 发布,翻译遵循 CC BY-SA 4.0 许可协议

我是 https://github.com/beached/daw_json_link 的作者。你说得对,C++ 目前没有反射,如果能把简单的东西排除在外,那会很好。但是通过定义一个简单的声明性映射,JSON Link 将为您的类型提供一个类型检查的解析器。例如,您指定的类可以映射为:

     class Example {
      std::string string;
      std::map<std::string, std:string> map;
      std::vector<int> vector;
    };

    namespace daw::json {
      template<>
      struct json_data_contract<Example> {
        using type = json_member_list<
          json_link<"string", std::string>,
          json_link<"map", std::map<std::string, std::string>>
          json_link<"vector", std::vector<int>>>;

        static inline auto to_json_data( Example const & v ) {
          return std::forward_as_tuple( v.string, v.map, v.vector );
        }
      };
    }

从这里您可以在另一个内部使用此映射作为 json_class<"Name", Example> 。按照您的要求进行序列化只是 auto json_document = daw::json::to_json( MyExampleValue ) 或解析它 daw::json::from_json<Example>( json_document ); 的问题。该库的美妙之处在于它为您的类型生成自定义解析器,并在解析时对数据进行类型检查。

原文由 Beached 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题