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

NJsonSchema生成含oneOf的additionalProperties致混合值验证失败问题

NJsonSchema生成含JsonExtensionData的Schema时,验证混合类型额外属性失败的问题

问题描述

当使用NJsonSchema从带有JsonExtensionDataAttribute特性的C#类型生成JSON Schema时,生成的Schema会将additionalProperties设置为如下结构:

"additionalProperties": {
    "oneOf": [
      {},
      {
        "type": "null"
      }
    ]
}

此时验证同时包含字符串和null类型额外属性的JSON数据时,会触发验证失败,报错信息为:

JSON is valid against more than one schema from 'oneOf'. Valid schema indexes: 0, 1.

原因分析

这个问题并非设计限制,而是NJsonSchema生成Schema时的逻辑错误:

  • oneOf关键字要求被验证的值必须且只能匹配其中一个子schema
  • 生成的第一个子schema{}是空schema,允许任何值(包括null);第二个子schema明确只允许null
  • 当额外属性值为null时,它同时匹配两个子schema,违反了oneOf的规则,导致验证失败

解决办法

方案1:手动修改生成后的Schema

将oneOf替换为anyOf,anyOf允许值匹配任意数量的子schema,不会触发冲突:

"additionalProperties": {
  "anyOf": [
    {},
    {
      "type": "null"
    }
  ]
}

方案2:调整Schema生成配置

通过JsonSchemaGeneratorSettings修改生成逻辑,直接生成允许任意类型(包括null)的additionalProperties:

var settings = new JsonSchemaGeneratorSettings();
// 配置额外属性允许任意类型(包括null)
settings.AdditionalPropertiesSchema = new JsonSchema();
settings.AdditionalPropertiesSchema.Type = JsonSchemaType.None; // None表示不限制类型,接受任何值

var schema = JsonSchema.FromType<Example>(settings);
var generatedSchema = schema.ToJson();

注意:不同版本的NJsonSchema可能配置项略有差异,需根据使用版本调整。

补充说明

C#中JsonExtensionData对应的IDictionary<string, object>本身可以存储任何类型的值(包括null),所以合理的Schema应该允许额外属性为任意类型。NJsonSchema生成的oneOf结构是不合理的,替换为anyOf或直接设置不限类型即可解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:37:21