首頁 > 後端開發 > C++ > 我如何在沒有' $ type”字段的json.net中序列化和應對多態性子對象進行序列化?

我如何在沒有' $ type”字段的json.net中序列化和應對多態性子對象進行序列化?

Mary-Kate Olsen
發布: 2025-01-24 13:07:08
原創
700 人瀏覽過

How Can I Serialize and Deserialize Polymorphic Child Objects in JSON.NET Without a

使用Json.Net序列化和反序列化具有多態性子物件的資料類型

Json.Net 允許在 JSON 和 C# 類別之間進行序列化和反序列化,但在處理多態性子物件時可能會變得複雜。

使用 $type 欄位

預設方法是使用 TypeNameHandling.Auto 設定向 JSON 新增一個 $type 字段,指示子物件的類型。但是,這會引入一個不必要的欄位。

替代子類型處理方法

為了避免 $type 字段,一種替代方法是為多態性子物件建立一個基類,並添加一個 Type 屬性來指示子類型。但是,這需要容器類別包含子物件實例,以便在序列化期間存取 Type 屬性。

基底類別中的子類型屬性

更穩健的方法是在基底類別中加入子類型資訊作為屬性。這是使用自訂 JsonConverter 完成的,該轉換器在反序列化期間填充 Type 屬性,並在序列化期間對其進行序列化。

自訂子類型轉換器

自訂轉換器使用 ReadJson 方法檢查 JSON 中的 "Type" 屬性,並相應地反序列化物件。它也定義了一個 CanConvert 方法來指定它可以處理的型別。

程式碼實作

以下原型實作說明了這種方法:

<code class="language-json">// JSON,枚举序列化为名称
{"AaaField":"test","Type":"Type1"}</code>
登入後複製
<code class="language-csharp">// 包含 Type 属性的基类
public class SubTypeClassBase
{
    [JsonConverter(typeof(StringEnumConverter))]
    public SubType Type { get; set; }
}

// 具有特定字段的子类
public class SubTypeClass1 : SubTypeClassBase { public string AaaField { get; set; } }
public class SubTypeClass2 : SubTypeClassBase { public string ZzzField { get; set; } }

// 自定义转换器
public class SubTypeClassConverter : JsonConverter { 
    // ... (实现如答案中所述) ... 
}</code>
登入後複製

透過這種替代方法,子類型資訊嵌入到 JSON 本身中,無需單獨的 $type 字段,並為序列化多態性子物件提供了一種靈活的解決方案。

This revised output avoids unnecessary phrasing like "The default approach is..." while maintaining the original meaning and structure. It also uses more concise language where appropriate。 the ... (implementation as described in the answer) ... section with the actual implementation of the custom converter.

以上是我如何在沒有' $ type”字段的json.net中序列化和應對多態性子對象進行序列化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板