JavaScriptSerializer
进行 JSON 反序列化:字段名称映射挑战问题: 当 JSON 字段名称与 C# 属性名称不同时,使用 JavaScriptSerializer
直接将 JSON 数据反序列化为 C# 对象通常会带来挑战。 XmlElement
属性无法解决此映射问题。
场景:
假设您有以下 JSON:
<code class="language-json">{"user_id":1234, "detail_level":"low"}</code>
对应的 C# 类:
<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
由于名称不匹配,将无法正确映射字段。
解决方案:利用DataContractJsonSerializer
推荐的方法是使用DataContractJsonSerializer
代替。此序列化器允许通过 DataMember
属性进行显式映射。
修改后的 C# 类:
<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>
注意: DetailLevel
属性现在是 string
以避免枚举潜在的反序列化问题。
用法示例:
<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>
此代码演示了 DataContractJsonSerializer
如何正确地将 JSON 字段(“user_id”、“detail_level”)映射到相应的 C# 属性(UserId
、DetailLevel
),尽管名称存在差异。 请记住在生产环境中反序列化期间处理潜在的异常。
以上是如何使用 JavaScriptSerializer 将 JSON 字段名称映射到不同的 C# 对象字段名称?的详细内容。更多信息请关注PHP中文网其他相关文章!