使用JavaScriptSerializer将实体映射到JSON

我的实体是这样的:

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中出现的键值对的顺序?

您需要将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"}} 

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

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