Как можно установить для свойства 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 и т. Д.)

Другие вопросы по тегам