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

使用NJsonSchema验证含$ref的JSON Schema时路径解析失败求助

解决NJsonSchema中"无法解析JSON路径'/defs/product'"的错误

问题原因

  1. 主Schema(ImageSchema.json)中$ref: "/defs/product"的相对路径无法被NJsonSchema自动关联到外部Product Schema文件,且该路径未对应已加载Schema的$id。
  2. 原两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:42:12