JavaScriptSerializer
untuk Penyahserialisasian JSON: Cabaran Pemetaan Nama MedanMasalah: Menyahsiri data JSON secara langsung ke dalam objek C# menggunakan JavaScriptSerializer
selalunya memberikan cabaran apabila nama medan JSON berbeza daripada nama sifat C#. Atribut XmlElement
tidak menyelesaikan isu pemetaan ini.
Senario:
Katakan anda mempunyai JSON ini:
<code class="language-json">{"user_id":1234, "detail_level":"low"}</code>
Dan kelas C# yang sepadan ini:
<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
akan gagal memetakan medan dengan betul kerana nama tidak sepadan.
Penyelesaian: Memanfaatkan DataContractJsonSerializer
Pendekatan yang disyorkan ialah menggunakan DataContractJsonSerializer
sebaliknya. Penyeri bersiri ini membenarkan pemetaan eksplisit melalui atribut DataMember
.
Kelas C# yang diubah suai:
<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>
Nota: Harta DetailLevel
kini menjadi string
untuk mengelakkan potensi masalah penyahserialisasian dengan enum.
Contoh Penggunaan:
<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>
Kod ini menunjukkan cara DataContractJsonSerializer
memetakan medan JSON ("user_id", "detail_level") dengan betul kepada sifat C# yang sepadan (UserId
, DetailLevel
) walaupun terdapat perbezaan nama. Ingat untuk mengendalikan kemungkinan pengecualian semasa penyahserikatan dalam persekitaran pengeluaran.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memetakan Nama Medan JSON kepada Nama Medan Objek C# yang Berbeza Menggunakan JavaScriptSerializer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!