使用JavaScriptSerializer将实体映射为JSON

8

我的实体是这样的:

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"
                     }
}

注意:上面只是一个示例。
我所需要的是,在序列化时自定义密钥。默认情况下,它会将属性名称作为密钥。我无法更改属性名称。怎么做?
此外,有可能改变JSON对象中键值对出现的顺序吗?
2个回答

5

您需要为您的类添加DataContract属性,并为属性添加DataMember。将DataMember属性的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"}}

如果我想将 {"Age":25,"Name":"Kushan","PostalAddress":{"City":"Matale","Country":"Sri Lanka","Number":"No 25","Street":"Main Street"}} 映射到类中,那么怎么做呢? - Chintan
这个问题要求使用JavaScriptSerializer而不是DataContractJsonSerializer。我认为你的回答没有提供任何关于JavaScriptSerializer的相关信息,是误导性的。 - Mayank

3
你可以使用JavaScriptSerializer序列化匿名类型,因此你可以尝试将对象投影到要序列化的形状中:
person.Select(s => new { PER_NAME = s.Name, PER_AGE = s.Age });

谢谢Gibson..但是Alex的回答最清晰明了..我接受了.. :) - Sency

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接