
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中文网其他相关文章!