JavaScriptSerializer
pour la désérialisation JSON : défis de mappage des noms de champsProblè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!