我想创建一个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]
}
我研究了几个用于创建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,而不必更改数据类型或将数据复制到新的数据类型?
谢谢。
发布于 2011-11-22 07:53:35
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将是一个很好的起点。
发布于 2013-11-14 17:54:40
任何好的C++ JSON库都应该做到这一点,但令人遗憾的是,它们没有做到这一点--除了ThorsSerializer和这篇question中提到的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);
示例用法:
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);
}
运行:
{
"string": "Some Text",
"map":
{
"ace": "the best",
"king": "second best"
},
"vector": [ 1, 2, 3, 4]
}
在C++中,您无法做得比这更好。
发布于 2011-11-22 07:59:59
您想要JSON映射还是对象?(您的示例显示了一个类,但您说的是一个映射)。对于地图,请查看这个库- JSON Spirit。
对于对象: C++中没有反射支持(除了非常有限的RTTI),所以也没有“一键式”的序列化解决方案。任何解决方案都将要求您编写额外的、可能是紧密耦合的代码,用于您想要序列化和反序列化的类(这取决于您是否想序列化非公共数据)。
https://stackoverflow.com/questions/8220130
复制相似问题