在.NET 8中如何让Json Schema生成器识别[JsonRequired]替代[Required]?
问题
环境:.NET 8,使用NuGet包JsonSchema.Net.Generation。
官方文档提到,从C#类生成JSON Schema时,可用[Required]标记属性为必填;但用System.Text.Json反序列化时,需要用[JsonRequired]属性。目前只能同时添加两个属性才能兼顾反序列化与Schema生成,想知道是否可配置SchemaBuilder仅识别[JsonRequired]?
尝试以下代码后,生成的Schema未将标记[JsonRequired]的属性标记为必填:
using System; using System.Text.Json; using System.Text.Json.Serialization; using Json.Schema; using Json.Schema.Generation; public class Program { public static void Main() { var config = new SchemaGeneratorConfiguration(); config.Nullability = Json.Schema.Generation.Nullability.AllowForNullableValueTypes; var schemaBuilder = new JsonSchemaBuilder(); var schema = schemaBuilder.FromType<Test1>(config).Build(); Console.WriteLine(JsonSerializer.Serialize(schema)); } } public class Test1 { [JsonRequired] public int? Test {get;set;} public string Test2 {get;set;} }
解决方案
可以通过自定义属性处理器让Schema生成器识别[JsonRequired]属性,具体操作:
- 创建一个继承自
AttributeHandler<JsonRequiredAttribute>的处理器类,在处理逻辑中标记属性为必填:
public class JsonRequiredAttributeHandler : AttributeHandler<JsonRequiredAttribute> { public override void Process(JsonRequiredAttribute attribute, AttributeHandlerContext context) { // 将属性标记为必填 context.SchemaBuilder.Required(context.PropertyName); // 若属性是可空值类型,移除null约束(可选,根据需求调整) if (context.PropertyType.IsNullableValueType) { context.SchemaBuilder.Type(context.PropertyType.GetUnderlyingNullableType()); } } }
- 在Schema生成配置中注册这个自定义处理器:
var config = new SchemaGeneratorConfiguration(); config.Nullability = Json.Schema.Generation.Nullability.AllowForNullableValueTypes; // 添加自定义处理器 config.AttributeHandlers.Add(new JsonRequiredAttributeHandler());
修改后的完整代码:
using System; using System.Text.Json; using System.Text.Json.Serialization; using Json.Schema; using Json.Schema.Generation; public class Program { public static void Main() { var config = new SchemaGeneratorConfiguration(); config.Nullability = Json.Schema.Generation.Nullability.AllowForNullableValueTypes; // 注册自定义处理器 config.AttributeHandlers.Add(new JsonRequiredAttributeHandler()); var schemaBuilder = new JsonSchemaBuilder(); var schema = schemaBuilder.FromType<Test1>(config).Build(); Console.WriteLine(JsonSerializer.Serialize(schema)); } } public class Test1 { [JsonRequired] public int? Test {get;set;} public string Test2 {get;set;} } // 自定义属性处理器 public class JsonRequiredAttributeHandler : AttributeHandler<JsonRequiredAttribute> { public override void Process(JsonRequiredAttribute attribute, AttributeHandlerContext context) { context.SchemaBuilder.Required(context.PropertyName); // 针对可空值类型,移除null类型约束(确保Schema只包含基础类型) if (context.PropertyType.IsNullableValueType) { context.SchemaBuilder.Type(context.PropertyType.GetUnderlyingNullableType()); } } }
运行这段代码后,生成的Schema会将标记[JsonRequired]的Test属性标记为必填,同时保留System.Text.Json反序列化的[JsonRequired]校验逻辑,无需再添加[Required]属性。
内容的提问来源于stack exchange,提问作者helm100
相关产品推荐
相关产品推荐

