JavaScriptSerializer
für die JSON-Deserialisierung: Herausforderungen bei der Zuordnung von FeldnamenProblem: Die direkte Deserialisierung von JSON-Daten in ein C#-Objekt mithilfe von JavaScriptSerializer
stellt oft eine Herausforderung dar, wenn sich JSON-Feldnamen von C#-Eigenschaftsnamen unterscheiden. Das XmlElement
-Attribut löst dieses Zuordnungsproblem nicht.
Szenario:
Nehmen wir an, Sie haben diesen JSON:
<code class="language-json">{"user_id":1234, "detail_level":"low"}</code>
Und diese entsprechende C#-Klasse:
<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
wird die Felder aufgrund der Namenskonflikte nicht korrekt zuordnen können.
Lösung: Nutzung von DataContractJsonSerializer
Der empfohlene Ansatz besteht darin, stattdessen DataContractJsonSerializer
zu verwenden. Dieser Serializer ermöglicht die explizite Zuordnung über das Attribut DataMember
.
Modifizierte C#-Klasse:
<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>
Hinweis: Die Eigenschaft DetailLevel
ist jetzt eine string
, um potenzielle Deserialisierungsprobleme mit Aufzählungen zu vermeiden.
Beispielverwendung:
<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>
Dieser Code zeigt, wie DataContractJsonSerializer
die JSON-Felder („user_id“, „detail_level“) trotz der Namensunterschiede korrekt den entsprechenden C#-Eigenschaften (UserId
, DetailLevel
) zuordnet. Denken Sie daran, mögliche Ausnahmen während der Deserialisierung in einer Produktionsumgebung zu behandeln.
Das obige ist der detaillierte Inhalt vonWie kann ich JSON-Feldnamen mit JavaScriptSerializer verschiedenen C#-Objektfeldnamen zuordnen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!