Json.net派生型態反序列化
在處理JSON資料時,序列化和反序列化遵循基底類別-衍生類別關係的物件可能很有優勢。但是,Json.net(Newtonsoft)需要特定的配置才能有效地處理派生類型。
問題:
考慮以下基底類別和衍生類別:
<code>public class Base { public string Name; } public class Derived : Base { public string Something; }</code>
如果您嘗試將包含基底類別和衍生類別物件的JSON字串反序列化為List<Base>
,您只會得到基底類別對象,從而遺失衍生型別資訊。
解:
要成功反序列化派生類型,您需要啟用類型名稱處理。這可以透過建立一個JsonSerializerSettings
物件並將TypeNameHandling
屬性設為All
來實現。將此設定物件傳遞給序列化和反序列化操作:
<code>Base object1 = new Base() { Name = "Object1" }; Derived object2 = new Derived() { Something = "Some other thing" }; List<Base> inheritanceList = new List<Base>() { object1, object2 }; JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }; string Serialized = JsonConvert.SerializeObject(inheritanceList, settings); List<Base> deserializedList = JsonConvert.DeserializeObject<List<Base>>(Serialized, settings);</code>
透過啟用型別名稱處理,Json.net將在JSON字串中包含型別資訊。在反序列化期間,它將使用此資訊正確地重新建立派生物件並填充deserializedList
。
注意: 使用此方法會在序列化資料中公開所有物件的名稱以及清單本身。如果這是個問題,請考慮處理多態關係的替代方法。
以上是如何在保留型別資訊的同時反序列化 JSON.NET 中的衍生型別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!