首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析serde_json/serde_yaml中的"$ref“

解析serde_json/serde_yaml中的"$ref“
EN

Stack Overflow用户
提问于 2019-09-11 07:22:05
回答 1查看 203关注 0票数 2

递归解析JSON文档中的所有$ref的最佳方法是什么?

一种直接的方法是创建一个接受Deserialize对象或所需值的{"$ref"}实现,比如如下所示的枚举:

代码语言:javascript
复制
enum JRef<T> {
    Value(T),
    Ref(URI),
}

impl<'de, T> Deserialize<'de> for JRef<T> { ... }

但是这需要我用JRef<T>包装我的所有类型,所以我的derive(Deserialize)模式结构中填充了样板:

代码语言:javascript
复制
#[derive(Deserialize)]
struct Foo {
    a: JRef<Bar>,
    b: JRef<(JRef<Qux>, JRef<Corge>)>,
    ...
}

此外,该基准的分辨率也是样板。

我理解类型的直接反序列化不应该依赖于某种外部状态,所以首先反序列化为JRef,然后再解析它们是有意义的。但是为了防止编写样板代码,以后执行的解析可以使用自定义proc宏执行,该宏派生出原始类型的JRef无关类型,该类型实现了接受外部函数并使用外接函数解析URI的特性。

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

EN

回答 1

Stack Overflow用户

发布于 2022-11-19 10:38:16

我想:这要看情况。您的代码的进一步用途是什么?

  • 您只需要反序列化代码生成吗?
  • 您正在修改JSON并再次序列化它吗?

对于第一种情况,有一个很好的例子:图式 A)在lib/src/schema.rs中可以找到要序列化的模式。它包含类型为$ref的选项。此外,lib/src/lib.rs包含一个扩展程序,将$ref转换为Rust源代码。(至少这是我的理解。)

我必须处理后一种情况--序列化和反序列化。从第一个示例中可以看到A和skip。我计划将我的模式放入一个对象中,隐藏$ref,而客户端可能透明地处理JSON对象。

欢迎提出意见。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57884060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档