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
Libérer: 2025-01-10 08:22:41
original
242 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal