2012-08-09 26 views
5

Necesito serializar algunas clases de entidad a JSON, usando Json.NET. Con el fin de personalizar los nombres de las propiedades, yo uso el atributo [JsonProperty] así:¿Puedo personalizar la serialización de Json.NET sin anotar mis clases?

[JsonProperty("lastName")] 
    public string LastName { get; set; } 

El problema es que yo preferiría no tiene ningún atributos relacionados con JSON-en mis entidades ... ¿Hay una forma de externalizar las anotaciones de alguna manera, para que no atemperen mis entidades?

Usando XmlSerializer, se puede hacer fácilmente con la clase XmlAttributeOverrides. ¿Hay algo similar para Json.NET?

Respuesta

5

Sí, puede crear una resolución de contrato personalizada y personalizar la definición JsonProperty sin el uso de atributos. Ejemplo es el siguiente:

class Person { public string First { get; set; } } 

class PersonContractResolver : DefaultContractResolver 
{ 
    protected override JsonProperty CreateProperty(
     MemberInfo member, 
     MemberSerialization memberSerialization) 
    { 
     var property = base.CreateProperty(member, memberSerialization); 

     if (member.DeclaringType == typeof(Person) && member.Name == "First") 
     { 
      property.PropertyName = "FirstName"; 
     } 

     return property; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var result = JsonConvert.SerializeObject(
      new Person { First = "John" }, 
      new JsonSerializerSettings 
      { 
       ContractResolver = new PersonContractResolver() 
      }); 

     Console.WriteLine(result); 
    } 
} 

Esta salida de este programa muestra será la siguiente:

// {"FirstName":"John"} 
+0

Gracias, se ve como una buena solución. Probablemente intentaré hacerlo más genérico ... –

+0

Finalmente tomé una ruta diferente (creé clases específicas en vez de serializar las entidades directamente a JSON), pero tendré en cuenta su solución para la próxima vez. ¡Gracias! –

Cuestiones relacionadas