Gestion des écarts entre les noms de propriétés JSON et .NET avec JavaScriptSerializer
Le JavaScriptSerializer
dans .NET nécessite parfois des ajustements lors du mappage des noms de champs JSON aux propriétés de votre objet .NET. Par exemple, un champ JSON tel que « user_id » devra peut-être être mappé à une propriété .NET nommée « UserId ». Personnaliser directement les noms de champs avec JavaScriptSerializer
à l'aide d'annotations n'est pas réalisable.
Une solution supérieure : DataContractJsonSerializer
Pour un mappage flexible des noms de champs, DataContractJsonSerializer
propose une solution plus robuste. Il exploite l'attribut [DataMember]
pour définir explicitement le mappage :
[DataContract] public class DataObject { [DataMember(Name = "user_id")] public int UserId { get; set; } [DataMember(Name = "detail_level")] public string DetailLevel { get; set; } }
Ce code garantit que le champ JSON "user_id" remplit correctement la propriété UserId
dans votre objet .NET.
Test du DataContractJsonSerializer
Voici un exemple de test unitaire démontrant la fonctionnalité :
using System.Runtime.Serialization.Json; using System.Text; using System.IO; using Microsoft.VisualStudio.TestTools.UnitTesting; [TestClass] public class DataContractJsonSerializerTest { [TestMethod] public void DataObjectSerializationTest() { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DataObject)); string jsonData = "{\"user_id\":1234,\"detail_level\":\"low\"}"; //Example JSON using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonData))) { DataObject dataObject = (DataObject)serializer.ReadObject(ms); Assert.IsNotNull(dataObject); Assert.AreEqual("low", dataObject.DetailLevel); Assert.AreEqual(1234, dataObject.UserId); } } }
Remarque importante sur les énumérations :
Lorsque vous traitez des énumérations dans la réponse JSON de votre serveur, convertissez-les en chaînes avant la désérialisation avec DataContractJsonSerializer
pour éviter d'éventuelles erreurs d'analyse. Le mappage d'énumération direct peut être problématique.
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!