如何在使用NJsonSchema生成模式时将AllowAdditionalProperties设置为true ?



我们现在将使用NJsonSchema来检查Json文件中的必需字段,并且我们允许用户添加一些额外的字段以供本地使用。因此,它必须允许在Json文件中添加其他属性。

通过使用njsonschema,可以设置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。当然,我们知道这不是一个合适的方法,但目前我们找不到其他的方法,如果有合适的方法,我们希望以后再用。

似乎这只是生成模式的默认设置,但是我们找不到这样的选项(可能我们错过了),有人知道我们如何在生成模式时改变这个设置吗?

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

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

你也应该设置它在其他属性(如Items, AdditionalPropertiesSchema等)

相关内容

  • 没有找到相关文章

最新更新