繁体   English   中英

解析 serde_json/serde_yaml 中的“$ref”

[英]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 我真的需要做所有这些,还是我错过了一个更简单的解决方案?

我认为:这取决于。 您的代码的进一步目的是什么?

  • 您是否只需要反序列化来生成代码?
  • 是修改JSON再序列化吗?

对于第一种情况,有一个很好的例子: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM