Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Memetakan Nama Medan JSON kepada Nama Medan Objek C# yang Berbeza Menggunakan JavaScriptSerializer?

Bagaimanakah Saya Boleh Memetakan Nama Medan JSON kepada Nama Medan Objek C# yang Berbeza Menggunakan JavaScriptSerializer?

Linda Hamilton
Linda Hamiltonasal
2025-01-10 08:22:41246semak imbas

How Can I Map JSON Field Names to Different C# Object Field Names Using JavaScriptSerializer?

Menggunakan JavaScriptSerializer untuk Penyahserialisasian JSON: Cabaran Pemetaan Nama Medan

Masalah: 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn