在serde_json / serde_yaml

时间:2019-09-11 07:22:05

标签: json rust serde json-ref

递归解析JSON文档中的所有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-macro来执行稍后执行的解析,该宏可以派生原始类型的无JRef类型,该宏实现接受外部函数并使用该外部函数解析URI的特征。

到目前为止,我已经深入研究了依赖项生态系统,以便仅解决单个$ref。我真的需要做所有这些事情吗,还是我错过了一个更简单的解决方案?

0 个答案:

没有答案