首页 >后端开发 >C++ >如何使用 JavaScriptSerializer 将 JSON 字段名称映射到不同的 C# 对象字段名称?

如何使用 JavaScriptSerializer 将 JSON 字段名称映射到不同的 C# 对象字段名称?

Linda Hamilton
Linda Hamilton原创
2025-01-10 08:22:41246浏览

How Can I Map JSON Field Names to Different C# Object Field Names Using JavaScriptSerializer?

使用 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# 属性(UserIdDetailLevel),尽管名称存在差异。 请记住在生产环境中反序列化期间处理潜在的异常。

以上是如何使用 JavaScriptSerializer 将 JSON 字段名称映射到不同的 C# 对象字段名称?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn