JsonSchemaGenerator未将字段设置为required = false

时间:2014-08-21 15:56:51

标签: c# json json.net jsonschema

我使用来自JsonSchemaGenerator的{​​{1}}对一系列模型将各自的JSON模式输出到如下的字典中。

JSON.NET

除了为JsonSchemaGenerator generator = new JsonSchemaGenerator() { UndefinedSchemaIdHandling = UndefinedSchemaIdHandling.UseTypeName, }; List<Type> modelTypes = Assembly.GetExecutingAssembly() .GetTypes() .ToList() .Where(t => t.Namespace == "MyApp.Models") .ToList(); foreach (Type type in modelTypes) { JsonSchema schema = generator.Generate(type, jsonSchemaResolver, false); schemaDictionary.Add(type, schema); } 属性设置的值外,这项工作正常。无论我如何装饰模型属性,始终字段都显示为required,如下所示:

"required":true

但是,在代码中我的模型是这样装饰的:

"FirstName": {
   "required": true,
   "type": "string"
}

查看Json.Net documentation,设置为[JsonProperty(Required = Required.Default)] public string FirstName { get; set; } 会导致架构中属性:

  

&#34;默认 - 0 - 属性必需。默认状态。&#34;

关于我做错了什么并且需要更改以便Required.Default属性在架构中输出为FirstName的任何想法?我想要生成并手动按摩所有这些模式。

1 个答案:

答案 0 :(得分:7)

Required枚举控制属性可以具有的值:是否允许空值。要控制json模式中的"required"属性,意味着json字符串是否必须包含实际属性,您需要在生成模式时使用DefaultValueHandlingNullValueHandling枚举。可以说我们有以下课程:

public class Person
{
        [JsonProperty(Required = Required.Default)]
        public string FirstName { get; set; }    
}

使用JSON.NET为此类生成的模式如下所示:

{
    "id": "MyApp.Models.Person",
    "type": "object",
    "properties": {
        "FirstName": {
            "required": true,
            "type": [
                "string",
                "null"
            ]
        }
    }
}

此模式指示json字符串必须具有属性FirstName,并且此属性允许具有空值。

通过将Required属性从Default更改为Always,我们将获得以下架构:

{
    "id": "MyApp.Models.Person",
    "type": "object",
    "properties": {
        "FirstName": {
            "required": true,
            "type": "string"
        }
    }
}

此模式指示json字符串必须具有属性FirstName,并且此属性不允许具有空值。

要获得所需内容,您需要包含DefaultValueHandlingNullValueHandling枚举。像这样:

public class Person
{
    [JsonProperty(Required = Required.Default, DefaultValueHandling = DefaultValueHandling.Ignore)]
    public string FirstName { get; set; }    
}

此类中生成的架构如下所示:

{
    "id": "MyApp.Models.Person",
    "type": "object",
    "properties": {
        "FirstName": {
            "type": [
                "string",
                "null"
            ]
        }
    }
}

此模式指示json字符串中不需要FirstName属性,但如果存在,则它可能具有null值。如果您使用DefaultValueHandling.IgnoreAndPopulate枚举值或切换到NullValueHandling属性而不是DefaultValueHandling属性并将其值设置为NullValueHandling.Ignore,则可以获得相同的效果。