如何通过$ref引用JSON Schema?war包中遇解析错误求助
解决networknt schema中相对路径$ref解析失败与UnknownHostException问题
针对相对路径$ref无法解析的解决方法
networknt的JSON Schema实现不会自动扫描目录加载依赖的Schema文件,必须手动将所有关联的Schema注册到加载器中,才能解析相对路径引用。
- 保持
car.json中的相对路径$ref不变:
{ "properties": { "date": { "$ref": "./genericPattern.json#/patterns/DatePattern" } } }
- 加载Schema时,显式将两个文件都添加到
SchemaLoader中:
// 从类路径加载两个Schema文件 JsonNode genericSchema = JsonLoader.fromInputStream( Thread.currentThread().getContextClassLoader().getResourceAsStream("genericPattern.json") ); JsonNode carSchema = JsonLoader.fromInputStream( Thread.currentThread().getContextClassLoader().getResourceAsStream("car.json") ); // 构建SchemaLoader并注册所有依赖Schema SchemaLoader loader = SchemaLoader.builder() .addSchema(URI.create("genericPattern.json"), genericSchema) .addSchema(URI.create("car.json"), carSchema) .build(); // 加载并使用目标Schema Schema schema = loader.loadSchema(carSchema);
针对$id导致UnknownHostException的解决方法
设置$id为远程URL时,networknt会尝试发起网络请求获取对应资源,当域名不存在时就会抛出UnknownHostException。解决方式是使用本地标识的$id:
- 给两个Schema文件设置本地$id(使用文件名或相对URI即可):
genericPattern.json:
{ "$id": "genericPattern.json", "patterns": { "DatePattern": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" } } }
car.json:
{ "$id": "car.json", "properties": { "date": { "$ref": "./genericPattern.json#/patterns/DatePattern" } } }
- 依然使用上面的
SchemaLoader方式加载两个Schema,此时加载器会通过本地$id识别关联的Schema,不会发起远程请求。
内容的提问来源于stack exchange,提问作者Ciprian Istrate
相关产品推荐
相关产品推荐

