Json.Net 允許在 JSON 和 C# 類別之間進行序列化和反序列化,但在處理多態性子物件時可能會變得複雜。
預設方法是使用 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中文網其他相關文章!