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

如何在Newtonsoft JSON Schema生成中正确定义枚举数组?

Newtonsoft JSON Schema 枚举数组生成问题排查

初始问题

使用Newtonsoft库生成JSON Schema时,枚举数组无法生成预期的枚举约束结构。相关代码如下:

public class Building
{
    [Required]
    [MaxLength(100)]
    public string Name { get; set; }

    [Required]
    [Phone]
    public string PhoneNumber { get; set; }

    [Required]
    [EnumDataType(typeof(BuildingZone))]
    public string[] Zone { get; set; }   // 需调整声明让JSON Schema生成枚举值数组
    //public BuildingZone[] Zone { get; set; } 
}

public enum BuildingZone
{
    Residential,
    Commercial,
    Industrial
}

当前生成的JSON Schema中zone字段:

"zone": {
  "type": "array",
  "items": {
    "type": [
      "string",
      "null"
    ]
  }
}

期望的zone字段结构:

"zone": {
    "type": "array",
    "items": {
        "type": "string",
        "enum": ["Residential", "Commercial", "Industrial"]
    }
}

部分解决情况

将字段改为BuildingZone[]类型并添加StringEnumConverter后,生成的Schema符合预期:

[JsonProperty("Zone",ItemConverterType=typeof(StringEnumConverter))] 
public BuildingZone[] Zone { get; set; }

但对外部库中的PMType枚举数组使用相同方法时,生成的Schema项仍为整数类型:

[JsonProperty("PMType", ItemConverterType = typeof(StringEnumConverter))]
public PMType[] pmtype { get; set; } 

对应生成的Schema:

"PMType": {
      "type": "array",
      "items": {
        "type": "integer"
      }
    } 

已确认外部库中的PMType枚举包含预期值,以下是具体调试排查思路:

调试排查思路

  • 检查外部枚举定义:确认PMType是否带有[Flags]特性,或是有自定义数值赋值(如直接指定整数、[EnumMember(Value = "...")]特性),特殊定义可能干扰Schema生成逻辑。
  • 排查全局转换器冲突:检查项目是否注册了全局枚举转换器(比如通过DefaultContractResolver强制枚举按整数序列化),全局设置会覆盖字段级别的ItemConverterType配置,可临时移除全局转换器测试。
  • 反射验证枚举元数据:写测试代码通过反射获取PMType的成员和特性,确认Newtonsoft能正确识别其字符串值:
foreach (var member in typeof(PMType).GetMembers(BindingFlags.Public | BindingFlags.Enum))
{
    var enumMemberAttr = member.GetCustomAttribute<EnumMemberAttribute>();
    Console.WriteLine($"{member.Name}: {enumMemberAttr?.Value ?? member.Name}");
}
  • 验证Newtonsoft版本兼容性:不同版本的Newtonsoft.Json和Newtonsoft.Json.Schema对外部枚举的处理逻辑可能有差异,尝试升级到最新稳定版测试。
  • 显式配置Schema生成规则:生成Schema时手动指定枚举处理方式,强制按字符串生成:
var settings = new JsonSchemaGeneratorSettings
{
    DefaultEnumHandling = EnumHandling.String
};
var generator = new JsonSchemaGenerator(settings);
var schema = generator.Generate(typeof(YourClass));

内容的提问来源于stack exchange,提问作者Anit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:55:02