相关疑难解决方法(0)

C++ JSON序列化

我想要一种尽可能自动地将对象序列化和反序列化为JSON的方法.

序列化: 对我来说,理想的方法是,如果我在实例中调用JSONSerialize(),它将返回一个带有JSON对象的字符串,该对象具有该对象的所有公共属性"name_of_property": "value".对于那些作为原语的值,它很简单,对于它应该尝试在每个JSONSerialize()或ToString()上调用的对象来递归序列化所有公共属性.对于集合,它也应该正常运行(只需矢量/数组就可以了).

反序列化:只需创建给定对象的实例(让我们说一只狗)并调用JSONDeserialize(json_string),这应该填充所有公共属性,在属性不是基元或需要的集合的情况下创建所需的对象.

一个例子应该像这样运行:

Dog *d1 = new Dog();
d1->name = "myDog";

string serialized = d1->JSONSerialize();

Dog *d2 = new Dog();
d2->JSONDeserialize(serialized);
std::cout << d2->name; // This will print "myDog"
Run Code Online (Sandbox Code Playgroud)

或者像那样:

Dog *d1 = new Dog();
d1->name = "myDog";

string serialized = JSONSerializer.Serialize(d1);

Dog *d2 = JSONSerializer.Deserialize(serialized, Dog);
std::cout << d2->name; // This will print "myDog"
Run Code Online (Sandbox Code Playgroud)

我该如何轻松地将其拉下来?

c++ json

44
推荐指数
4
解决办法
7万
查看次数

有没有办法使用Cereal/C++为std :: map指定更简单的JSON(de-)序列化?

我正在开发的项目是一个管理大量自定义硬件设备的C++应用程序.该应用程序具有客户端的套接字/端口接口(如GUI).每种设备类型都有自己定义良好的JSON模式,我们可以使用Cereal对这些模式进行序列化.

但该应用程序还需要解析来自客户端的入站JSON请求.请求的一部分指定设备过滤器参数,大致类似于SQL'WHERE'子句,其中所有表达式都是AND.例如:

"filter": { "type": "sensor", "status": "critical" }
Run Code Online (Sandbox Code Playgroud)

这将指示客户端想要在具有"关键"状态的每个"传感器"设备上执行操作.从表面上看,似乎过滤器参数的C++实现将是std :: map.但是当我们尝试使用Cereal反序列化它失败的对象时.当我们序列化硬编码的过滤器映射时,它看起来像这样:

"filter": [
   { "key": "type", "value": "sensor" },
   { "key": "status", "value": "critical" }
]
Run Code Online (Sandbox Code Playgroud)

现在我可以理解为什么Cereal支持这种详细的地图序列化.毕竟,地图的关键字可以是非字符串类型.但在这种情况下,键一个字符串.

我并不十分热衷于重写我们的界面规范,并让我们的客户生成明显非惯用的JSON,以满足Cereal.我是谷歌的新手,我们坚持这一点.有没有办法告诉Cereal将此过滤器解析为std :: map?或者我可能是错误的方式.是否还有其他一些我们应该反序列化的stl容器?

c++ serialization json stl cereal

9
推荐指数
1
解决办法
4309
查看次数

如何编写模板将矢量转换为Json :: Value(jsoncpp)

我写了一个模板(如下所示),但无法编译

template<class t, template<typename> class iterable>
Json::Value iterable2json(const iterable<t>& cont)
{
    Json::Value v;
    for(const t& elt : cont)
    {
        v.append(elt);
    }
    return v;
}

std::vector<int> vec{1,2,3};
Json::Value v = iterable2json(vec)
Run Code Online (Sandbox Code Playgroud)

错误C3312:找不到类型为'const std :: _ Vector_val <_Val_types>'的可调用'begin'函数

[_Val_types = std :: _ Simple_types]

请参阅函数模板实例化'Json :: Value iterable2json,std :: _ Vector_val>(const std :: _ Vector_val <_Val_types>&)'正在编译

[_Value_type = int,_Val_types = std :: _ Simple_types]

错误C3312:找不到类型'const std :: _ Vector_val <_Val_types>'的可调用'end'函数

[_Val_types = std :: _ Simple_types]

错误C2065:'elt':未声明的标识符

c++ templates

4
推荐指数
1
解决办法
3886
查看次数

如何使用json c ++和我自己的对象?

我打算在https://github.com/nlohmann/json#examples上使用json c ++ .阅读完简单的例子之后,我仍然不知道如何将它与我自己的对象一起使用?例如,我有一个班级

class Student
{
public:
    Student(int id, string const& name)
       : m_id(id), m_name(name)
    {}   

private:
    int m_id;
    string m_name;
};
Run Code Online (Sandbox Code Playgroud)

如何使用json读取和写入(反序列化和序列化)Student对象?

c++ serialization json deserialization

2
推荐指数
2
解决办法
2463
查看次数

标签 统计

c++ ×4

json ×3

serialization ×2

cereal ×1

deserialization ×1

stl ×1

templates ×1