[英]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
。 我真的需要做所有這些,還是我錯過了一個更簡單的解決方案?
我認為:這取決於。 您的代碼的進一步目的是什么?
對於第一種情況,有一個很好的例子: 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.