
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!
Nombor halaman perkataan bermula dari halaman ketiga sebagai 1 tutorial
Tiga kaedah pengekodan yang biasa digunakan
Penggunaan fungsi terima
Apakah enjin aliran kerja java yang ada?
Bagaimana untuk mengikat data dalam senarai lungsur
Apakah perisian pengaturcaraan bahasa C?
Apakah itu CONNECTION_REFUSED
Bagaimana untuk menyelesaikan 400 permintaan buruk