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

使用Newtonsoft.Json.Schema解析外部JSON Schema时引用解析失败

解决Newtonsoft.Json.Schema解析本地相对路径Schema引用失败的问题

问题根源

  1. 相对路径错误:template.json位于res文件夹下,原引用路径./defs/definitions.json会尝试在res/defs目录下查找文件,但实际defs与res是同级目录,路径需要向上回溯一级。
  2. 默认未启用本地引用解析:直接用JSchema.Parse传入文件内容时,解析器无法获取当前文件的实际路径,无法正确计算相对引用位置;且Newtonsoft.Json.Schema默认不会自动加载本地文件引用,需手动配置解析器。

修复步骤

1. 修正Schema文件中的引用路径

修改template.json里的$ref值:

"$ref": "../defs/definitions.json#/$defs/author"

2. 调整C#解析代码,配置引用解析器

使用JSchemaReaderSettings配合FileSystemSchemaResolver,明确告知解析器文件的基准路径,同时启用引用解析:

using Newtonsoft.Json.Schema;
using System.IO;

string templateSchemaPath = "./res/template.json";
// 获取模板文件的绝对目录作为解析基准
string baseSchemaDir = Path.GetDirectoryName(Path.GetFullPath(templateSchemaPath));

var readerSettings = new JSchemaReaderSettings
{
    // 设置文件系统解析器,指定基准目录
    Resolver = new FileSystemSchemaResolver(baseSchemaDir),
    // 启用引用自动解析
    ResolveReferences = true
};

// 使用FromFile方法加载,解析器会自动关联文件路径处理相对引用
var schema = JSchema.FromFile(templateSchemaPath, readerSettings);

3. 确保文件被复制到输出目录

右键项目中的template.json和definitions.json,在属性窗口设置:

  • 复制到输出目录:选择「如果较新则复制」或「始终复制」
    保证运行时程序能在输出目录找到对应的Schema文件。

补充说明

  • 避免使用JSchema.Parse(File.ReadAllText(path)):这种方式仅传入字符串内容,解析器无法获取文件实际路径,无法正确计算相对引用位置。
  • FileSystemSchemaResolver会基于指定的基准目录,自动解析相对路径指向的本地Schema文件,无需硬编码绝对路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:46:05