Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在JSON中标记对象的继承?_C++_Json_Inheritance_Format - Fatal编程技术网

C++ 如何在JSON中标记对象的继承?

C++ 如何在JSON中标记对象的继承?,c++,json,inheritance,format,C++,Json,Inheritance,Format,我将用JSON设计一个简单的数据格式,它将序列化一些稍微不同的机器类型的配置数据。数据格式应该支持继承-如果在“InheritedObject”中只更改了一个(或一些)参数,我可以主要使用“BaseObject”的参数。 我的第一个想法显示在以下代码段中: { "BaseObject": { "Description": "some text", "Type": "4", "Value": 0.33 }, "Inh

我将用JSON设计一个简单的数据格式,它将序列化一些稍微不同的机器类型的配置数据。数据格式应该支持继承-如果在“InheritedObject”中只更改了一个(或一些)参数,我可以主要使用“BaseObject”的参数。 我的第一个想法显示在以下代码段中:

{
    "BaseObject":
    {
        "Description": "some text",
        "Type": "4",
        "Value": 0.33
    },

    "InheritedObject":
    {
        "Parent": "BaseObject",
        "Element_3": 11
    }
}
我至少有三个用例:

  • 从JSON读取(如果我使用“InheritedObject”,我希望从InheritedObject中获取所有元素,加上在InheritedObject中未覆盖的BaseOjbect中的元素)
  • 写入JSON((自动?)比较“BaseObject”和“InheritedObject”之间的差异,并将差异写入“InheritedObject”)
  • 更改基类中的参数也会自动更改继承对象中的参数
我认为这应该行得通,但在读写JSON时需要做一些额外的工作


是否有一个“内置”功能或至少在JSON中支持这个?如果是这样,哪个C++的JSON库支持它(JSONCPP,JSON精灵)?或者有一个最佳实践方法从头开始实现这个功能,或者在XML或YAML(或其他什么)上有好的支持吗?-我还没有完全固定使用JSON?

我所知道的大多数序列化工具/库都不使用这种方法,而是将类和所有实例数据存储到一个JSON对象中。我不确定为什么您首先需要这样做,因为有些操作通常非常简单(有多少个[类型X]的对象?)可能会变得非常复杂,计算速度也很慢(简单的存储:只需要JSON对象的数量,就可以了。您的“存储继承”方法:加载所有内容,解析继承的数据“引用”等等)

<>我不太明白需要分离基础数据和继承的类数据,因为在读取数据时,可以忽略未知属性(与处理真实C++对象相反)所以我不建议把它复杂化,只要把所有的对象数据存储在一个JSON对象中,如果你的原因是,你就不能在C++中有重复的属性。
如果您考虑的是存储大小,那么很可能不值得这么做。除非您要存储数百万个对象,但是无论如何,带有JSON详细信息的文本格式都不是首选的工具。在这种情况下,请选择boost.serialization、QDataStream或类似的二进制格式。

在以下情况下您会怎么做:BO(BaseObject)有一个名为“par”的参数。此参数在IO_1(继承对象_1)中被覆盖在IOI2中保持不变。现在我在IOA2中改变了PAR。PAR应该在IOI2中改变,但是在IOY1中没有变化。你的解决方案没有继承。我认为你正在扰乱类、继承和类实例。你不想存储类,是吗?回到原来的情况:C++中的任何对象只能有一个值和一个值。不管它的属性在哪里,它的答案是:“不,这样的结构不存在。要么我在IOY1中改变它,IOG2是继承层次的一部分,然后PAR在实例中到处都被改变,或者IOI2不是它的一部分,然后我不能从IOI2访问IOG1实例的道具。“正如我在问题中所说的,这是机器参数的数据格式。我不想序列化类。我想将一台机器的参数集表示为一个对象。我想使用的是重新定义这可能是C++中只针对类而不是对象——但是正如已经说过的,它应该用于不同的机器,既不属于软件类也不适用于软件对象。对于任何在这里寻找类似解决方案的人来说,在JaxLimeDimeDimeTimes游戏(开源,C++)中实现了这样的JSON结构的解串器。。在Python中搜索类似的反序列化程序时发现此问题。