递归解析JSON文档中的所有$ref的最佳方法是什么?
一种直接的方法是创建一个接受Deserialize对象或所需值的{"$ref"}实现,比如如下所示的枚举:
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>)>,
...
}此外,该基准的分辨率也是样板。
我理解类型的直接反序列化不应该依赖于某种外部状态,所以首先反序列化为JRef,然后再解析它们是有意义的。但是为了防止编写样板代码,以后执行的解析可以使用自定义proc宏执行,该宏派生出原始类型的JRef无关类型,该类型实现了接受外部函数并使用外接函数解析URI的特性。
到目前为止,我已经深入研究了依赖生态系统,以便只解决一个$ref。我真的需要这么做吗,还是我错过了一个更简单的解决方案?
发布于 2022-11-19 10:38:16
我想:这要看情况。您的代码的进一步用途是什么?
对于第一种情况,有一个很好的例子:图式 A)在lib/src/schema.rs中可以找到要序列化的模式。它包含类型为$ref的选项。此外,lib/src/lib.rs包含一个扩展程序,将$ref转换为Rust源代码。(至少这是我的理解。)
我必须处理后一种情况--序列化和反序列化。从第一个示例中可以看到A和skip。我计划将我的模式放入一个对象中,隐藏$ref,而客户端可能透明地处理JSON对象。
欢迎提出意见。
https://stackoverflow.com/questions/57884060
复制相似问题