2012-08-09 24 views
5

Ho bisogno di serializzare alcune classi di entità su JSON, usando Json.NET. Esiste unPosso personalizzare la serializzazione Json.NET senza annotare le mie classi?

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

Il problema è, preferirei non avere alcun attributo JSON-correlate nei miei entità ... è il seguente: Al fine di personalizzare i nomi delle proprietà, io uso l'attributo [JsonProperty] come questo modo di esternare le annotazioni in qualche modo, in modo che non ingombrino le mie entità?

Utilizzando XmlSerializer, è possibile farlo facilmente con la classe XmlAttributeOverrides. C'è qualcosa di simile per Json.NET?

risposta

5

Sì, è possibile creare un sistema di risoluzione del contratto personalizzato e personalizzare la definizione JsonProperty senza l'uso di attributi. Esempio segue:

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

Questa uscita di questo programma di esempio sarà il seguente:

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

Grazie, sembra una buona soluzione. Io probabilmente cercare di renderlo più generico anche se ... –

+0

alla fine ho preso una strada diversa (ho creato le classi specifiche, invece di serializzare i soggetti direttamente a JSON), ma io mantenere la soluzione in mente per la prossima volta. Grazie! –

Problemi correlati