使用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 });