2013-01-12 6 views
20

Jeśli chcesz zwrócić obiekty z metod działania w Web Api z małymi nazwami w stylu JSON, czy istnieje sposób na alias nazw właściwości, aby obiekt C# poniżej wygląda na następujący obiekt JSON.Czy istnieje sposób na alias właściwości modelu odpowiedzi w ASP.Net Web API

C# Response model

public class Account 
    { 
     public int Id { get; set; } 
     public string AccountName { get; set; } 
     public decimal AccountBalance { get; set; } 

    } 

JSON, że chciałbym zostać zwrócone

{ 
     "id" : 12, 
     "account-name" : "Primary Checking", 
     "account-balance" : 1000 
    } 

Odpowiedz

40

Można użyć JSON.NET na JsonProperty

public class Account 
    { 
     [JsonProperty(PropertyName="id")] 
     public int Id { get; set; } 
     [JsonProperty(PropertyName="account-name")] 
     public string AccountName { get; set; } 
     [JsonProperty(PropertyName="account-balance")] 
     public decimal AccountBalance { get; set; } 
    } 

Będzie to działać tylko z JSON .NET - oczywiście. Jeśli chcesz być bardziej agnostykiem i mają ten rodzaj nazewnictwa, aby móc innych potencjalnych formatujących (tj chcesz zmienić Json.NET do czegoś innego, albo dla serializacji XML), odnośnik System.Runtime.Serialization i zastosowanie:

[DataContract] 
public class Account 
    { 
     [DataMember(Name="id")] 
     public int Id { get; set; } 
     [DataMember(Name="account-name")] 
     public string AccountName { get; set; } 
     [DataMember(Name="account-balance")] 
     public decimal AccountBalance { get; set; } 
    } 
+0

Dla użytkowników tego rozwiązania, należy pamiętać, że stosowanie ' [DataContract] 'do klasy wymaga atrybutu' [DataMember] 'na wszystkich * właściwościach, które mają być serializowane. To znaczy. jeśli zaczniesz od klasy z 10 właściwościami, które są domyślnie serializowane seryjnie, i dodaj '[DataContract]' do klasy i '[DataMember (Name =" a-new-name ")]' do tej właściwości, pozostałe 9 właściwości nie będą już serializowane. – AronVanAmmers

+0

i jak zmienić nazwę modelu (Konto, tutaj)? – sepehr

16

Powyższa odpowiedź Filipa jest świetna, jeśli potrzebujesz szczegółowej kontroli nad serializacją, ale jeśli chcesz dokonać globalnej zmiany, możesz to zrobić za pomocą jednego linijka, jak pokazano poniżej.

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter()); 
     config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = 
      new CamelCasePropertyNamesContractResolver(); // This line will cause camel casing to happen by default. 
    } 
} 

http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#json_camelcasing

Edit oparciu o komentarzach poniżej poszedł do przodu i dodanych blogu z kompletnego rozwiązania tutaj: http://www.ryanvice.net/uncategorized/extending-json-net-to-serialize-json-properties-using-a-format-that-is-delimited-by-dashes-and-all-lower-case/

+0

Chociaż jest to dobry pomysł i wyraźnie łatwiejsze niż zdefiniowanie wszystkich tych atrybutów, nie jest to tym, o co prosił OP. To nie rozwiązuje problemu. – justabuzz

+0

@Ryan Twój link nie działa, teraz znajduje się tutaj: http://www.vicesoftware.com/uncategorized/extending-json-net-to-serialize-json-properties-using-a-format-that- jest rozdzielany przez kreski i wszystkie małe litery / – DHFW

Powiązane problemy