首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用NJsonSchema生成模式时,如何将AllowAdditionalProperties设置为true

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

Stack Overflow用户
提问于 2016-08-06 19:32:33
回答 2查看 1.6K关注 0票数 3

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

通过使用NJsonSchma,有针对additionalProperties的设置,但是当我们使用FromType生成模式,然后设置选项AllowAdditionalProperties时,它将只应用于顶级,

例如:

代码语言:javascript
复制
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的属性。即

代码语言:javascript
复制
// 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\"}";

我们甚至尝试构建一个迭代函数来设置属性字典中的值,但它仍然不能改变行为:

代码语言:javascript
复制
public static void SetAditionalProperties(JsonProperty jp)
{
    jp.AllowAdditionalProperties = true;
    foreach (KeyValuePair<string, JsonProperty> kv in jp.Properties)
    {
        SetAditionalProperties(kv.Value);
    }
}

我们现在唯一能做的就是下载源代码,并将AllowAdditionalProperties的getter更改为一直返回true。当然,我们知道这不是一种合适的方式,但目前我们找不到任何替代方法,如果有的话,我们想在以后使用合适的方式。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-07 23:17:24

你必须实现你自己的JsonSchemaGenerator:

代码语言:javascript
复制
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;
    }
}

然后,您可以像这样生成模式:

代码语言:javascript
复制
var generator = new MyJsonSchemaGenerator(new JsonSchemaGeneratorSettings());
var schema = generator.Generate(typeof (Person), new SchemaResolver());
票数 2
EN

Stack Overflow用户

发布于 2016-08-06 20:12:40

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38803798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档