首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将C++类转换为JSON

将C++类转换为JSON
EN

Stack Overflow用户
提问于 2011-11-22 07:43:11
回答 12查看 90.6K关注 0票数 66

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

例如,

代码语言:javascript
复制
class Example {  
    std::string string;  
    std::map<std::string, std:string> map;  
    std::vector<int> vector;  
};

会变成:

代码语言:javascript
复制
{
    "string":"the-string-value",
    "map": {
        "key1":"val1",
        "key2":"val2"
    },
    "vector":[1,2,3,4]
}

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

做这件事最好的方法是什么?

谢谢你的帮助。

编辑

我已经调查了以下内容:

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

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

编辑2

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

有没有一种很好的方法可以将包含std:map、std::vectors、std::list、数字、字符串和bools的std::map转换为JSON,而不必更改数据类型或将数据复制到新的数据类型?

谢谢。

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2011-11-22 07:53:35

JSON Spirit允许你这样做:

代码语言:javascript
复制
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();

输出:

代码语言:javascript
复制
{
    "house_number" : 42,
    "road" : "East Street",
    "town" : "Newtown"
}

我想,json_map_demo.cpp将是一个很好的起点。

票数 29
EN

Stack Overflow用户

发布于 2013-11-14 17:54:40

任何好的C++ JSON库都应该做到这一点,但令人遗憾的是,它们没有做到这一点--除了ThorsSerializer和这篇question中提到的Nosjob之外。

当然,C++没有像Java那样的反射,所以你必须显式地注释你的类型:

(从ThorsSerializer文档复制)

代码语言:javascript
复制
#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);

示例用法:

代码语言:javascript
复制
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);
}

运行:

代码语言:javascript
复制
{
    "string": "Some Text",
    "map":
    {
        "ace": "the best",
        "king": "second best"
    },
    "vector": [ 1, 2, 3, 4]
}

在C++中,您无法做得比这更好。

票数 17
EN

Stack Overflow用户

发布于 2011-11-22 07:59:59

您想要JSON映射还是对象?(您的示例显示了一个类,但您说的是一个映射)。对于地图,请查看这个库- JSON Spirit

对于对象: C++中没有反射支持(除了非常有限的RTTI),所以也没有“一键式”的序列化解决方案。任何解决方案都将要求您编写额外的、可能是紧密耦合的代码,用于您想要序列化和反序列化的类(这取决于您是否想序列化非公共数据)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8220130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档