2012-01-09 12 views
254

Mam niektóre dane w obiekcie C# DataSet. Mogę je szeregować teraz za pomocą konwertera Json.NET jak tenJak zmienić nazwy właściwości podczas serializacji za pomocą Json.net?

DataSet data = new DataSet(); 
// do some work here to populate 'data' 
string output = JsonConvert.SerializeObject(data); 

Jednak ta używa nazwy właściwości od data podczas drukowania do pliku .json. Chciałbym zmienić nazwy właściwości na coś innego (powiedzmy, zmień "foo" na "bar").

W polu "Serializacja i Deserializacja JSON" → "Atrybuty serializacji" w polu "Serializacja i Deserializacja JSON" → "JsonPropertyAttribute ... pozwala na dostosowanie nazwy". Ale nie ma żadnego przykładu. Czy ktoś wie, jak użyć JsonPropertyAttribute, aby zmienić nazwę właściwości na coś innego?

(Direct link to documentation)

dokumentacja Json.NET wydaje się być niewielka. Jeśli masz świetny przykład, postaram się go dodać do oficjalnej dokumentacji. Dzięki!

+3

FYI, istnieje taki przykład w dokumentacji w [Przykłady -> Serializowanie JSON -> Nazwa JsonPropertyAttribute] (http://james.newtonking.com/json/help/?topic=html/JsonPropertyName.htm) . Nie jestem pewien, w którym momencie został dodany. –

Odpowiedz

477

Można ozdobić usługi, którą chcesz kontrolujący swoją nazwę z atrybutem [JsonProperty] który pozwala określić inną nazwę:

[JsonProperty(PropertyName = "FooBar")] 
public string Foo { get; set; } 

Dokumentacja: Serialization Attributes

+1

Czy to wymaga odczytywania moich danych do utworzonego obiektu niestandardowego, a nie zestawu danych? – culix

+3

@culix, tak, wymaga użycia modelu. DataSet jest słabo wpisaną strukturą, więc mówienie o nazwach właściwości nie jest zbyt logiczne. –

+31

Jako skrót można również zrobić '[JsonProperty („blabla”)]' –

41

Jeśli nie masz dostępu do klasy, aby zmienić właściwości, lub nie chcesz zawsze używać tej samej właściwości zmiany nazwy, zmiana nazwy można również wykonać, tworząc własny program tłumaczący.

Na przykład, jeśli masz klasę o nazwie MyCustomObject, który ma właściwość o nazwie LongPropertyName, można użyć niestandardowego resolverowi takiego ...

public class CustomDataContractResolver : DefaultContractResolver 
{ 
    public static readonly CustomDataContractResolver Instance = new CustomDataContractResolver(); 

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
    var property = base.CreateProperty(member, memberSerialization); 
    if (property.DeclaringType == typeof(MyCustomObject)) 
    { 
     if (property.PropertyName.Equals("LongPropertyName", StringComparison.OrdinalIgnoreCase)) 
     { 
     property.PropertyName = "Short"; 
     } 
    } 
    return property; 
    } 
} 

Następnie zadzwonić do serializacji i dostarczyć resolverowi

var result = JsonConvert.SerializeObject(myCustomObjectInstance, 
       new JsonSerializerSettings { ContractResolver = CustomDataContractResolver.Instance }); 

A wynik będzie skrócony do { "Short": "wartość"} prop zamiast { "LongPropertyName": "wartość"} prop

Więcej informacji na temat niestandardowych przeliczniki here

+0

To jest lepsze rozwiązanie, jeśli twoja klasa do serializacji jest zadeklarowana w innym zestawie, który zawiera inną wersję pakietu Newtonsoft.Json. (może nawet nie rzucić żadnego błędu). 'DefaultContractResolver' musi być umieszczony w tym samym zespole, w którym używana jest metoda JsonConvert.Serialize(). – Artemious

0

Jest jeszcze inny sposób na to, co jest za pomocą konkretnego NamingStrategy, który może być zastosowany do klasy lub własności przez zdobiące je [JSonObject] lub [JsonProperty].

Dostępne są predefiniowane strategie nazewnictwa, takie jak CamelCaseNamingStrategy, ale można wdrożyć własne.

Powiązane problemy