使用TypenameHandling.All和List <T>进行架构验证

时间:2019-10-07 10:33:34

标签: c# json.net jsonschema

我在我的Settings-Editor应用程序中使用Newtonsoft.Json.Schema NuGet(版本3.0.11)时遇到问题。 GUI会接收每种类型的设置文件的设置文件(序列化为json)和json模式的列表。用户现在可以编辑设置文件,然后根据相应文件的架构对其进行验证。

我使用TypeNameHandling = TypeNameHandling.All对所有应用程序特定的设置(反序列化),因为特定设置文件中可能存在继承的类型。

我使用这样的NewtonSoft.Json.Schema在我的设置类上生成JSON模式:

new JSchemaGenerator().Generate(setting.GetType())

当我尝试针对先前生成的架构验证实时编辑的字符串时,我在ListOfItems属性的行上收到以下ValidationError:

  

无效的类型。预期为Array,为Null但得到了Object。

序列化列表的JSON如下所示:

{
  ...
  "ListOfItems": {
    "$type": "System.Collections.Generic.List`1[[MySubSettingsClass, MyAssembly]], mscorlib",
    "$values": [
      {
        "$type": "MySubSettingsClass, MyAssembly",
        ...
      }]
  }
}

模式如下:

    "ListOfItems": {
      "type": [
        "array",
        "null"
      ],
      "items": {
        "$ref": "#/definitions/MySubSettingsClass"
      }
    },

以某种方式,架构验证无法将列表类型解释为数组。

我已经尝试用这些子设置的数组替换列表,但这给了我同样的错误:

{
  "$type": "MySettingsClass, MyAssembly",
  "ListOfItems": {
    "$type": "MySubSettingsClass[], MyAssembly",
    "$values": [
     {
       ...
     }
  }
} 

我可以通过使用列表属性上方的某种属性来解决该问题吗?

0 个答案:

没有答案