簡體   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