Asignar entidad a JSON utilizando JavaScriptSerializer

Mis entidades son así:

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

Ahora quiero mapear este objeto newPerson en un objeto JSON como este,

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

Nota: Lo anterior es solo un ejemplo.

Lo que necesito es, necesito personalizar la clave en el momento de la serialización. por defecto, está tomando el nombre de la propiedad como la clave. No puedo cambiar los nombres de las propiedades. ¿Como hacer esto?

Además, ¿es posible cambiar el orden de los pares clave-valor que aparecen en JSON obj.?

DataMember agregar los atributos de DataContract a sus clases y DataMember a las propiedades. Establezca la propiedad Name del atributo DataMemeber con su nombre de propiedad personalizada y la propiedad Order para definir el pedido.

 [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; } } 

Entonces puedes hacer esto:

 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); 

Para comprobar el resultado:

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

Puede serializar un tipo anónimo con JavaScriptSerializer, por lo que podría intentar proyectar su objeto en la forma que desea serializar:

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