Как можно установить для свойства AllowAdditionalProperties значение true при создании схемы с помощью NJsonSchema
Теперь мы будем использовать NJsonSchema для проверки файлов Json только на наличие обязательных полей, и мы разрешаем пользователю добавлять некоторые дополнительные поля для их локального использования. Таким образом, он должен разрешить дополнительные свойства в файле Json.
Используя NJsonSchma, здесь есть настройка для AdditionalProperties, но когда мы генерируем схему с использованием FromType, а затем устанавливаем опцию AllowAdditionalProperties, она будет применяться только к верхнему уровню,
Например:
NJsonSchema.JsonSchema4 schema = JsonSchema4.FromType<Top>();
schema.AllowAdditionalProperties = true;
public class Item
{
public string code { get; set; }
public string name { get; set; }
}
public class Top
{
public List<Item> data { get; set; }
}
Теперь это позволяет дополнительные свойства для Top, но не для Item. т.е.
// allowed even ref is not defined in Top
var js = "{\"data\":[{\"code\":\"A01\",\"name\":\"apple\"}],\"ref\":\"A01\"}";
// ArrayItemNotValid as price is not defined in Item
var js = "{\"data\":[{\"code\":\"A01\",\"name\":\"apple\",\"price\":1.0}],\"ref\":\"A01\"}";
Мы даже пытаемся создать итерационную функцию для установки значения в словаре свойств, но она по-прежнему не может изменить поведение:
public static void SetAditionalProperties(JsonProperty jp)
{
jp.AllowAdditionalProperties = true;
foreach (KeyValuePair<string, JsonProperty> kv in jp.Properties)
{
SetAditionalProperties(kv.Value);
}
}
Единственное, что мы можем сделать сейчас - это загрузить исходный код и изменить получатель AllowAdditionalProperties, чтобы он всегда возвращал значение true. Конечно, мы знаем, что это неправильный путь, но мы не можем найти никакой альтернативы в данный момент, и мы хотели бы использовать правильный путь позже, если таковые имеются.
Кажется, что это просто настройка по умолчанию при создании схемы, но мы не можем найти такую опцию (может быть, мы ее пропустили), кто-нибудь знает, как мы можем изменить эту настройку при генерации схемы?
3 ответа
Вы должны реализовать свой собственный JsonSchemaGenerator:
public class MyJsonSchemaGenerator : JsonSchemaGenerator
{
public MyJsonSchemaGenerator(JsonSchemaGeneratorSettings settings)
: base(settings)
{
}
protected override void GenerateObject<TSchemaType>(Type type, TSchemaType schema, ISchemaResolver schemaResolver, ISchemaDefinitionAppender schemaDefinitionAppender)
where TSchemaType : JsonSchema4, new()
{
base.GenerateObject(type, schema, rootSchema, schemaDefinitionAppender, schemaResolver);
schema.AllowAdditionalProperties = true;
}
}
Затем вы можете сгенерировать схему следующим образом:
var generator = new MyJsonSchemaGenerator(new JsonSchemaGeneratorSettings());
var schema = generator.Generate(typeof (Person), new SchemaResolver());
Может быть, вы можете решить эту проблему с помощью глобального процессора схем, который изменяет все схемы?
https://github.com/RSuter/NJsonSchema/wiki/Schema-Processors
В SetAdditionalProperties
Вы также должны установить AllowAdditionalProperties
правда на jp.Item
свойство, если оно не равно нулю...
Вы также должны установить его для других свойств (например, Items, AdditionalPropertiesSchema и т. Д.)