You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:46:16