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

How to mark inheritance of an object in JSON?

本文关键字:对象 继承 JSON      更新时间:2023-10-16

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

{
    "BaseObject":
    {
        "Description": "some text",
        "Type": "4",
        "Value": 0.33
    },
    "InheritedObject":
    {
        "Parent": "BaseObject",
        "Element_3": 11
    }
}

我至少有三个用例:

  • 从JSON读取(如果我使用"InheritedObject",我希望从Inherited Object中获取所有元素,再加上在InheritedObject中未覆盖的BaseOjbect中的元素)
  • 写入JSON(((auto?)比较"BaseObject"answers"InheritedObject"之间的差异并将差异写入"Inherited Object")
  • 基类中参数的更改也应该自动更改继承对象中的参数

我认为这应该有效,但在读写JSON时需要一些额外的工作。

JSON中是否有"内置"功能,或者至少有很好的支持?如果是,C++的哪个JSON库支持它(JsonCpp,JSON Spirit)?或者有没有一种从零开始实现此功能的最佳实践方法。或者,在XML或YAML(或其他任何东西)中是否有对该任务的良好支持——我还没有完全固定于JSON?

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

我不认为有必要将基础数据和继承的类数据分开,因为在读取数据时可以忽略未知属性(与处理真实的C++对象相反)。所以我不建议让它变得如此复杂,只需将所有对象数据存储在一个JSON对象中即可。如果原因是这样的话,C++中也不能有重复的属性。

如果你考虑的是存储大小,那么这很可能不值得付出努力。除非您存储了数百万个对象,但无论如何,具有JSON详细程度的文本格式都不是首选工具。在这种情况下,选择boost.serialization、QDataStream或类似的二进制格式。