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

为何JSON Schema数组required属性未生效?C# Newtonsoft验证疑问

JSON Schema数组items规则验证问题解析

我使用C#的Newtonsoft库,通过response.IsValid(schema, out IList<string> messages);方法验证JSON响应与JSON Schema时,发现数组的items规则被忽略。我无法理解为何以下Schema能让响应{ "balance": 40.0, "bonuses": [ ] }验证通过,且多个在线验证工具结果一致。

原Schema代码

{
  "type": "object",
  "properties": {
    "balance": {
      "type": "number"
    },
    "bonuses": {
      "type": "array",
      "items": [
        {
          "type": "object",
          "properties": {
            "bonusAmount": {
              "type": "number"
            },
            "bonusID": {
              "type": "integer"
            }
          },
          "required": [
            "bonusAmount",
            "bonusID"
          ]
        }
      ]
    }
  },
  "required": [
    "balance",
    "bonuses"
  ]
}

问题原因

你把items定义成了数组形式,这种写法在JSON Schema的早期规范(如Draft 3)中用于元组验证——即要求数组的第N个元素匹配对应位置的子Schema。但空数组没有任何元素,自然不存在违反规则的情况,所以验证会通过。

修正方案

如果需要数组中的每一个元素都必须符合指定的对象Schema,要把items改成单个对象(而非数组),修改后的Schema如下:

{
  "type": "object",
  "properties": {
    "balance": {
      "type": "number"
    },
    "bonuses": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "bonusAmount": {
            "type": "number"
          },
          "bonusID": {
            "type": "integer"
          }
        },
        "required": [
          "bonusAmount",
          "bonusID"
        ]
      }
    }
  },
  "required": [
    "balance",
    "bonuses"
  ]
}

额外说明

修改后,空数组依然会验证通过(因为没有元素违反规则)。如果需要限制数组至少包含一个元素,可以在bonuses的Schema中添加"minItems": 1规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:39:52