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

C#项目中使用Newtonsoft.Json v13.0.1解析JSON Schema时无法解析$ref外部引用问题求助

解决Newtonsoft.Json.Schema无法解析本地$ref引用的问题

你遇到的核心问题是:Newtonsoft.Json.Schema默认不会自动加载本地文件系统中的外部Schema引用——虽然Visual Studio能识别这个引用(它有独立的Schema解析逻辑),但代码运行时必须手动配置解析规则,才能让JSchema正确解析$ref指向的本地文件。

问题根源

当你直接调用JSchema.Parse(schemaJson)时,默认解析器没有被配置为从本地文件系统加载关联的Schema文件。你需要通过FileSchemaResolver告诉解析器如何找到并加载Common.json,再通过SchemaReaderSettings将这个解析器注入到解析流程中。

解决方案步骤

  1. 修正文件名错误:先检查代码中的Schema文件名——你写的是appconfig-schema1.json,但实际文件是appconfig-schema.json,这个小疏忽可能先导致加载失败,优先修正它。
  2. 配置本地Schema解析器:使用FileSchemaResolver和SchemaReaderSettings启用本地文件引用的解析能力。

修改后的完整代码

bool validSchema = false;
IList<string> messages;
// 获取程序运行的基准目录,确保Common.json和appconfig-schema.json在此目录下
string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;

using (StreamReader r = new StreamReader("appconfig.json"))
{
    string json = r.ReadToEnd();
    string schemaJson = File.ReadAllText(Path.Combine(baseDirectory, "appconfig-schema.json"));

    // 配置支持本地文件引用的Schema解析器
    var fileResolver = new FileSchemaResolver(new Uri(baseDirectory));
    var readerSettings = new SchemaReaderSettings
    {
        Resolver = fileResolver,
        // 启用相对路径引用解析
        ResolveLocalReferences = true
    };

    // 使用带配置的重载方法解析Schema
    JSchema schema = JSchema.Parse(schemaJson, readerSettings);
    
    JObject configObject = JObject.Parse(json);
    validSchema = configObject.IsValid(schema, out messages);
}

// 输出验证结果
if (validSchema)
{
    Console.WriteLine("配置文件符合Schema规范");
}
else
{
    Console.WriteLine("配置文件不符合Schema规范,错误信息:");
    foreach (var msg in messages)
    {
        Console.WriteLine($"- {msg}");
    }
}

额外注意事项

  • 确保Common.json和appconfig-schema.json位于同一目录,或者通过FileSchemaResolver的构造函数Uri指定正确的基准路径。
  • 如果你的$ref使用相对路径,ResolveLocalReferences必须设为true,解析器才能正确处理路径映射。
  • 版本兼容:Newtonsoft.Json.Schema v13.0.1完全支持FileSchemaResolver,这个方案对你的版本完全适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:03:10