[英]Resolving "$ref" in serde_json/serde_yaml
递归解析 JSON 文档中所有JSON $ref
的最佳方法是什么?
一种直接的方法是创建一个Deserialize
实现,它接受{"$ref"}
object 或所需的值,比如这样的枚举:
enum JRef<T> {
Value(T),
Ref(URI),
}
impl<'de, T> Deserialize<'de> for JRef<T> { ... }
但这需要我将所有类型包装在JRef<T>
中,因此我的derive(Deserialize)
模式结构充满了样板文件:
#[derive(Deserialize)]
struct Foo {
a: JRef<Bar>,
b: JRef<(JRef<Qux>, JRef<Corge>)>,
...
}
此外,参考的分辨率也是样板。
我明白一个类型的直接反序列化不应该依赖于一些外部的 state,所以先反序列化成JRef
然后再解析它们是有意义的。 但是为了防止编写样板代码,稍后执行的解析可以使用派生原始类型的 JRef-free 类型的自定义 proc-macro 来执行,它实现了接受外部 function 并使用外部 function 解析 URI 的特征。
到目前为止,我已经深入研究了依赖生态系统,以便仅解析单个$ref
。 我真的需要做所有这些,还是我错过了一个更简单的解决方案?
我认为:这取决于。 您的代码的进一步目的是什么?
对于第一种情况,有一个很好的例子: schemafy A) 在schemafy_lib/src/schema.rs中可以找到要序列化的模式。 它包含一个 $ref,类型为 Option。 B) 此外, schemafy_lib/src/lib.rs包含一个扩展器,将 $ref 转换为 Rust 源代码。 (至少这是我的理解。)
我必须处理后一种情况——序列化和反序列化。 从第一个示例开始,A 跳过 B。我计划将我的架构放入 object,隐藏 $ref,而客户端可以透明地处理 JSON 对象。
欢迎发表评论。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.