2012-08-09 15 views
5

Potrzebuję serializować niektóre klasy encji do JSON, używając Json.NET. W celu dostosowania nazwy właściwości, używam atrybut [JsonProperty] takiego:Czy mogę dostosować serializację Json.NET bez adnotowania w moich klasach?

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

Problem polega na tym, wolałbym nie mieć żadnych atrybutów związanych z JSON w moim podmiotów ... Czy istnieje sposób jakoś uzewnętrznić adnotacje, żeby nie zaśmiecały moich istot?

Używając XmlSerializer, można to łatwo zrobić za pomocą klasy XmlAttributeOverrides. Czy jest coś podobnego w Json.NET?

Odpowiedz

5

Tak, można utworzyć niestandardowy przelicznik umów i dostosować definicję JsonProperty bez użycia atrybutów. Przykład następująco:

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

To wyjście z tego programu próbek będą następujące:

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

Dzięki, wygląda na to dobre rozwiązanie. Prawdopodobnie spróbuję uczynić to bardziej ogólnym ... –

+0

W końcu podjąłem inną trasę (stworzyłem określone klasy zamiast serializacji jednostek bezpośrednio do JSON), ale będę mieć na uwadze twoje rozwiązanie na następny raz. Dzięki! –

Powiązane problemy