JavaScriptSerializer
進行 JSON 反序列化:欄位名稱映射挑戰問題: 當 JSON 欄位名稱與 C# 屬性名稱不同時,使用 JavaScriptSerializer
直接將 JSON 資料反序列化為 C# 物件通常會帶來挑戰。 XmlElement
屬性無法解決此對應問題。
場景:
假設您有以下 JSON:
<code class="language-json">{"user_id":1234, "detail_level":"low"}</code>
對應的 C# 類別:
<code class="language-csharp">public class DataObject { public int UserId { get; set; } public DetailLevel DetailLevel { get; set; } public enum DetailLevel { Low, /* ... other values */ } }</code>
JavaScriptSerializer
由於名稱不匹配,將無法正確對應欄位。
解:利用DataContractJsonSerializer
建議的方法是使用DataContractJsonSerializer
代替。此序列化器允許透過 DataMember
屬性進行明確映射。
修改後的 C# 類別:
<code class="language-csharp">using System.Runtime.Serialization; [DataContract] public class DataObject { [DataMember(Name = "user_id")] public int UserId { get; set; } [DataMember(Name = "detail_level")] public string DetailLevel { get; set; } }</code>
注意: DetailLevel
屬性現在是 string
以避免枚舉潛在的反序列化問題。
用法範例:
<code class="language-csharp">using System.IO; using System.Runtime.Serialization.Json; using System.Text; // ... within a test method ... [TestMethod] public void DataContractJsonSerializerTest() { string jsonData = "{\"user_id\":1234, \"detail_level\":\"low\"}"; DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DataObject)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonData)); // UTF8 encoding is crucial DataObject dataObject = (DataObject)serializer.ReadObject(ms); Assert.IsNotNull(dataObject); Assert.AreEqual(1234, dataObject.UserId); Assert.AreEqual("low", dataObject.DetailLevel); }</code>
此程式碼示範了 DataContractJsonSerializer
如何正確地將 JSON 欄位(「user_id」、「detail_level」)對應到對應的 C# 屬性(UserId
、DetailLevel
),儘管名稱有差異。 請記住在生產環境中反序列化期間處理潛在的異常。
以上是如何使用 JavaScriptSerializer 將 JSON 欄位名稱對應到不同的 C# 物件欄位名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!