Maison >développement back-end >C++ >Comment puis-je mapper les noms de champs JSON à différents noms de champs d'objet C# à l'aide de JavaScriptSerializer ?

Comment puis-je mapper les noms de champs JSON à différents noms de champs d'objet C# à l'aide de JavaScriptSerializer ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-10 08:22:41298parcourir

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

Utilisation de JavaScriptSerializer pour la désérialisation JSON : défis de mappage des noms de champs

Problème : La désérialisation directe des données JSON dans un objet C# à l'aide de JavaScriptSerializer présente souvent des défis lorsque les noms de champs JSON diffèrent des noms de propriétés C#. L'attribut XmlElement ne résout pas ce problème de mappage.

Scénario :

Disons que vous avez ce JSON :

<code class="language-json">{"user_id":1234, "detail_level":"low"}</code>

Et cette classe C# correspondante :

<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 ne parviendra pas à mapper correctement les champs en raison de la non-concordance des noms.

Solution : Tirer parti de DataContractJsonSerializer

L'approche recommandée consiste à utiliser DataContractJsonSerializer à la place. Ce sérialiseur permet un mappage explicite via l'attribut DataMember.

Classe C# modifiée :

<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>

Remarque : La propriété DetailLevel est désormais un string pour éviter d'éventuels problèmes de désérialisation avec les énumérations.

Exemple d'utilisation :

<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>

Ce code montre comment DataContractJsonSerializer mappe correctement les champs JSON ("user_id", "detail_level") aux propriétés C# correspondantes (UserId, DetailLevel) malgré les différences de noms. N'oubliez pas de gérer les exceptions potentielles lors de la désérialisation dans un environnement de production.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn