如何在使用NJsonSchema生成架构时将AllowAdditionalProperties设置为true

时间:2016-08-06 11:32:33

标签: c# json 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的getter更改为始终返回true。当然我们知道这不是一种正确的方法,但是我们现在找不到任何替代方案,如果有的话,我们希望以后使用正确的方法。

这似乎只是生成架构的默认设置,但我们找不到这样的选项(也许我们已经错过了),有谁知道我们如何在生成架构时更改此设置?

2 个答案:

答案 0 :(得分:2)

您必须实现自己的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());

答案 1 :(得分:0)

SetAdditionalProperties中,如果AllowAdditionalProperties属性不为空,您还必须将jp.Item设置为true ...

您还应该在其他属性上设置它(即Items,AdditionalPropertiesSchema等)