使用NJsonSchema验证含$ref的JSON Schema时路径解析失败求助
解决NJsonSchema中"无法解析JSON路径'/defs/product'"的错误
问题原因
- 主Schema(ImageSchema.json)中
$ref: "/defs/product"的相对路径无法被NJsonSchema自动关联到外部Product Schema文件,且该路径未对应已加载Schema的$id。 - 原两个Schema文件存在JSON语法错误:主Schema的
required数组末尾有多余逗号;Product Schema中dot属性下的top/left未嵌套在properties节点内,这些都会导致解析失败。
解决方案步骤
1. 修正Schema文件的语法与引用路径
- 修改ImageSchema.json:将
$ref替换为Product Schema的完整$id值,同时移除required数组末尾的多余逗号:
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "title": "Image", "type": "object", "required": [ "identifier", "altText", "products" ], "properties": { "identifier": { "type": "string", "title": "Image identifier" }, "altText": { "type": "string", "title": "image alt text" }, "products": { "type": "array", "title": "list of products with markers", "items": { "$ref": "https://inter-ikea.atlassian.net/defs/product" } } } }
- 修改ProductSchema.json:修正
dot属性的结构(将top/left放入properties节点下),移除required数组末尾的多余逗号:
{ "$id": "https://inter-ikea.atlassian.net/defs/product", "$schema": "https://json-schema.org/draft/2020-12/schema", "title": "Product", "type": "object", "required": [ "dot" ], "properties": { "dot": { "title": "Dot coordinates and product", "type": "object", "required": [ "top", "left" ], "properties": { "top": { "type": "number", "description": "0-1 distance from top" }, "left": { "type": "number", "description": "0-1 distance from left" } } } } }
2. 在C#代码中加载并注册外部Schema
需要先加载Product Schema并注册到解析器中,确保主Schema解析时能找到对应的引用:
using JsonSchema = NJsonSchema.JsonSchema; using NJsonSchema; // 加载外部Product Schema string productSchemaContent = File.ReadAllText("../../.././ProductSchema.json"); var productSchema = await JsonSchema.FromJsonAsync(productSchemaContent); // 创建解析器并注册已加载的Product Schema var schemaResolver = new JsonSchemaResolver(); schemaResolver.AddSchema(productSchema); // 加载主Schema时传入自定义解析器 string mainSchemaContent = File.ReadAllText("../../.././ImageSchema.json"); var mainSchema = await JsonSchema.FromJsonAsync( mainSchemaContent, new JsonSchemaReaderSettings { SchemaResolver = schemaResolver } );
补充说明
如果不想使用绝对URI作为$ref,可以给主Schema添加$id(例如"https://inter-ikea.atlassian.net/image"),将Product Schema的$id设为相对路径(例如"defs/product"),此时主Schema的$ref可写为"defs/product",但仍需确保两个Schema都被加载并注册到同一个解析器中。
内容的提问来源于stack exchange,提问作者Karthick J
相关产品推荐
相关产品推荐

