JsonSchemaGenerator Not Setting Fields to required = false

本文关键字:required false to Fields Not Setting JsonSchemaGenerator | 更新日期: 2023-09-27 18:19:03

我使用JSON.NET中的JsonSchemaGenerator对一系列模型输出相应的JSON模式到字典中,如下所示。

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"
}

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

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

查看Json。Net文档,设置为Required.Default应该导致模式中需要属性而不是:

"Default - 0 -该属性是而不是必需的。默认状态。"

关于我做错了什么,需要改变,使FirstName属性在模式输出作为"required": false的想法吗?我确实不是想要生成和手动处理所有这些模式。

JsonSchemaGenerator Not Setting Fields to required = false

Required枚举控制属性可以有哪些值:是否允许null值。为了控制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属性,但如果存在,则可能为空值。如果您使用DefaultValueHandling.IgnoreAndPopulate enum值,或者如果您切换到NullValueHandling属性而不是DefaultValueHandling属性并将其值设置为NullValueHandling.Ignore,则可以达到相同的效果。