我使用来自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
的任何想法?我不想要生成并手动按摩所有这些模式。
答案 0 :(得分:7)
Required
枚举控制属性可以具有的值:是否允许空值。要控制json模式中的"required"
属性,意味着json字符串是否必须包含实际属性,您需要在生成模式时使用DefaultValueHandling
或NullValueHandling
枚举。可以说我们有以下课程:
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
,并且此属性不允许具有空值。
要获得所需内容,您需要包含DefaultValueHandling
或NullValueHandling
枚举。像这样:
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
,则可以获得相同的效果。