Проверка схемы с использованием TypenameHandling.All и List <T> - PullRequest
0 голосов
/ 07 октября 2019

У меня проблема с использованием Newtonsoft.Json.Schema NuGet (версия 3.0.11) с моим приложением «Редактор настроек». GUI получает список файлов настроек (сериализованных как json) и схемы json для каждого типа файла настроек. Теперь пользователь может редактировать файлы настроек, которые затем проверяются по схеме для соответствующего файла.

Я (де) сериализую все настройки, относящиеся к моим приложениям, используя TypeNameHandling = TypeNameHandling.All, поскольку в конкретном файле настроек могут быть унаследованные типы, расположенные в конкретном файле настроек. .

Я генерирую схему JSON в своем классе настроек, используя NewtonSoft.Json.Schema, как это:

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

Когда я пытаюсь проверить редактируемую строку в реальном времени по ранее сгенерированной схеме, я получаю следующую ValidationError в строке ListOfItems -property:

Недопустимый тип. Ожидаемый массив, нулевой, но получил объект.

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": [
     {
       ...
     }
  }
} 

Могу ли я решить эту проблему, используя некоторые атрибуты над списком-свойством?

...