将C++类转换为JSON

tgt*_*tgt 54 c++ serialization json

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

例如,

class Example {  
    std::string string;  
    std::map<std::string, std:string> map;  
    std::vector<int> vector;  
};
Run Code Online (Sandbox Code Playgroud)

会成为:

{
    "string":"the-string-value",
    "map": {
        "key1":"val1",
        "key2":"val2"
    },
    "vector":[1,2,3,4]
}
Run Code Online (Sandbox Code Playgroud)

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

最好的方法是什么?

谢谢你的帮助.

编辑

我调查了以下内容:

json spirit,jsoncpp,zoolib,JOST,CAJUN,libjson,nosjob,JsonBox,jsonme--

据我所知,我可以构建一个单独的JSON对象,如下面的答案和转换为JSON我希望能够将我的东西存储在标准集合中并进行转换.

编辑2

好吧,废弃了序列化类的想法,因为看起来C++缺乏反射是不可能的.

有没有一种很好的方法将包含std:maps,std :: vectors,std :: lists,numbers,strings和bools的std :: map转换为JSON,而无需更改数据类型或将数据复制到新的数据类型?

谢谢.

seh*_*ehe 24

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();
Run Code Online (Sandbox Code Playgroud)

输出:

{
    "house_number" : 42,
    "road" : "East Street",
    "town" : "Newtown"
}
Run Code Online (Sandbox Code Playgroud)

json_map_demo.cpp将是一个不错的地方开始,我想.

  • 我希望能够在不必将每个值复制到单独的JSON对象的情况下执行此操作. (2认同)
  • 你介意用_adapt_详细说明你的意思吗?你的意思是使用JSON Spirit对象而不是std :: map吗?我是C++的新手,习惯了几种必须使用反射的语言(我现在正在阅读).谢谢. (2认同)

Seb*_*ian 16

任何好的C++ JSON库都应该这样做,很遗憾看到它们没有 - 除了ThorsSerializer和这个问题中提到的明显的Nosjob.

当然,C++没有像Java那样的反射,所以你必须明确地注释你的类型:(
从ThorsSerializer文档中复制)

#include "ThorSerialize/JsonThor.h"
#include "ThorSerialize/SerUtil.h"
#include <map>
#include <vector>
#include <string>
#include <iostream>

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

    // Allow access to the class by the serialization library.
    friend class ThorsAnvil::Serialize::Traits<Example>;

    public:
        Example(std::string const& s, std::map<std::string, std::string> const& m, std::vector<int> const& v)
            : string(s), map(m), vector(v)
        {}
};

// Define what members need to be serilizable
ThorsAnvil_MakeTrait(Example, string, map, vector);
Run Code Online (Sandbox Code Playgroud)

用法示例:

int main()
{
    using ThorsAnvil::Serialize::jsonExport;
    using ThorsAnvil::Serialize::jsonImport;


    Example     e1 {"Some Text", {{"ace", "the best"}, {"king", "second best"}}, {1 ,2 ,3, 4}};

    // Simply serialize object to json using a stream.
    std::cout << jsonExport(e1) << "\n";

    // Deserialize json text from a stream into object.
    std::cin  >> jsonImport(e1);
}
Run Code Online (Sandbox Code Playgroud)

运行:

{
    "string": "Some Text",
    "map":
    {
        "ace": "the best",
        "king": "second best"
    },
    "vector": [ 1, 2, 3, 4]
}
Run Code Online (Sandbox Code Playgroud)

你不能在C++中做得更好.