【问题标题】:Map entity to JSON using JavaScriptSerializer使用 JavaScriptSerializer 将实体映射到 JSON
【发布时间】:2011-09-17 21:31:20
【问题描述】:

我的实体是这样的:

class Address
{
     public string Number { get; set; }
     public string Street { get; set; }
     public string City { get; set; }
     public string Country { get; set; }
}

class Person
{
     public string Name { get; set; }
     public int Age { get; set; }
     public Address PostalAddress { get; set; }
}

Person newPerson = 
    new Person()
    {
       Name = "Kushan",
       Age = 25,
       PostalAddress = 
           new Address()
           {
               Number = "No 25",
               Street = "Main Street",
               City = "Matale",
               Country = "Sri Lanka"
           }
    };

现在我想像这样将这个 newPerson 对象映射到 JSON 对象中,

{ 
     "PER_NAME" : "Kushan",
     "PER_AGE" : "25",
     "PER_ADDRESS" : {
                          "ADD_NUMBER" : "No 25",
                          "ADD_STREET" : "Main Street",
                          "ADD_CITY" : "Matale",
                          "ADD_COUNTRY" : "Sri Lanka"
                     }
}

注意:以上只是一个例子。

我需要的是,我需要在序列化时自定义 Key。默认情况下,它以属性名称作为键。我无法更改属性名称。如何做到这一点?

另外,是否可以更改 JSON obj 中键值对的出现顺序?

【问题讨论】:

    标签: c# jquery .net asp.net json


    【解决方案1】:

    您需要将DataContract 属性添加到您的类和DataMember 到属性。将DataMemeber 属性的Name 属性设置为您的自定义属性名称,并将Order 属性设置为定义顺序。

    [DataContract]
    public class Person
    {
        [DataMember(Name = "PER_NAME", Order = 1)]
        public string Name { get; set; }
    
        [DataMember(Name = "PER_AGE", Order = 2)]
        public int Age { get; set; }
    
        [DataMember(Name = "PER_ADDRESS", Order = 3)]
        public Address PostalAddress { get; set; }
    }
    

    那么你可以这样做:

    var newPerson = new Person()
    {
        Name = "Kushan",
        Age = 25,
        PostalAddress = new Address()
        {
            Number = "No 25",
            Street = "Main Street",
            City = "Matale",
            Country = "Sri Lanka"
        }
    };
    
    MemoryStream stream = new MemoryStream();
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
    ser.WriteObject(stream, newPerson);
    

    检查结果:

    var result = Encoding.ASCII.GetString(stream.ToArray());
    
    {"PER_NAME":"Kushan","PER_AGE":25,"PER_ADDRESS":{"ADD_NUMBER":"No 25","ADD_STREET":"Main Street","ADD_CITY":"Matale","ADD_COUNTRY":"Sri Lanka"}}
    

    【讨论】:

    • @AlexAza 如果我想将{"Age":25,"Name":"Kushan","PostalAddress":{"City":"Matale","Country":"Sri Lanka","Number":"No 25","Street":"Main Street"}} 映射到班级然后?
    • 该问题要求 JavaScriptSerializer 而不是 DataContractJsonSerializer。我认为您的回答具有误导性,但没有提供有关 JavaScriptSerializer 的任何相关信息。
    【解决方案2】:

    您可以使用 JavaScriptSerializer 序列化匿名类型,因此您可以尝试将对象投影到您想要序列化的形状中:

    person.Select(s => new { PER_NAME = s.Name, PER_AGE = s.Age });
    

    【讨论】:

    • 谢谢吉布森..但亚历克斯的回答是最清楚的..我接受了..:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    相关资源
    最近更新 更多