
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中文網其他相關文章!