處理JSON資料時,經常會遇到包含已知和未知欄位的混合結果。這在將資料反序列化到具有固定屬性集的類別時可能會帶來挑戰。
問題: 給定一個包含已知和未知字段的JSON結果,如何將其反序列化到一個包含已知字段屬性並能夠處理未知字段的類別中?
可能的解決方案:
使用JSON.NET的自訂契約解析器: 此解決方案需要一個自訂契約解析器來處理未知欄位。但是,理解如何實現這一點可能具有挑戰性。
資料契約序列化程式: 雖然資料契約序列化程序提供了用於序列化和反序列化的事件,但它僅支援覆寫特定方法,而不提供對欄位處理的完全控制。
序列化為動態物件和自訂映射: 這種方法涉及將JSON反序列化為動態對象,然後手動映射未知欄位。雖然可行,但這很可能需要大量的工作。
繼承自DynamicObject: 依賴反射進行反序列化的序列化程序在使用繼承自DynamicObject的類別時可能無法呼叫tryGetMember和trySetMember方法。
使用自訂序列化器的RESTSharp: 在RESTSharp中解決此問題需要使用自訂序列化器。
使用JsonExtensionDataAttribute(JSON.NET v5)的更好解決方案:
JSON.NET 5版引進了JsonExtensionDataAttribute,它提供了一種更輕鬆、更有效率的處理未知欄位的方法。
程式碼範例:
<code class="language-csharp">public class Product { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonExtensionData] public Dictionary<string, JToken> ExtraFields { get; set; } }</code>
在此範例中,ExtraFields字典將包含JSON結果中未知欄位的鍵值對。
結論:
透過利用JSON.NET 5版中的JsonExtensionDataAttribute,開發人員可以有效地管理JSON結果中的已知和未知字段,並透過ExtraFields字典存取未知字段。
以上是如何將包含已知和未知欄位的 JSON 反序列化為 C# 類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!