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
相关产品推荐
相关产品推荐

