
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!
Le numéro de page Word commence à partir de la troisième page comme 1 tutoriel
Trois méthodes d'encodage couramment utilisées
Utilisation de la fonction accepter
Quels sont les moteurs de workflow Java ?
Comment lier des données dans une liste déroulante
Que sont les logiciels de programmation en langage C ?
Qu'est-ce que CONNECTION_REFUSED ?
Comment résoudre 400 mauvaises requêtes