2012-01-09 3 views
254

devo alcuni dati in un oggetto C# DataSet. Posso serializzare in questo momento utilizzando un convertitore Json.net come questoCome posso cambiare i nomi delle proprietà durante la serializzazione con Json.net?

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

Tuttavia, questo utilizza i nomi delle proprietà da data quando si stampa il file .json. Mi piacerebbe cambiare i nomi delle proprietà per essere qualcosa di diverso (diciamo, cambia 'foo' in 'bar').

In Json.net documentation, in "Serializzazione e deserializzazione JSON" → "Attributi di serializzazione", viene indicato "JsonPropertyAttribute ... consente di personalizzare il nome". Ma non c'è nessun esempio. Qualcuno sa come usare un JsonPropertyAttribute di cambiare il nome della proprietà a qualcos'altro?

(Direct link to documentation)

documentazione del Json.net sembra essere sparse. Se hai un ottimo esempio, cercherò di farlo aggiungere alla documentazione ufficiale. Grazie!

+3

FYI, c'è un esempio di questo nella documentazione sotto [Samples -> Serializing JSON -> JsonPropertyAttribute name] (http://james.newtonking.com/json/help/?topic=html/JsonPropertyName.htm) . Non so a che punto è stato aggiunto. –

risposta

477

Si potrebbe decorare la proprietà che si desidera controllare il proprio nome con l'attributo [JsonProperty] che consente di specificare un nome diverso:

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

Documentazione: Serialization Attributes

+1

Questo richiede che ho letto i miei dati in un oggetto personalizzato che creo, piuttosto che un DataSet? – culix

+3

@culix, sì, richiede l'uso di un modello. Un DataSet è una struttura debolmente tipizzata, quindi parlare di nomi di proprietà non è molto logico. –

+31

Come una scorciatoia, puoi anche fare '[JsonProperty (" FooBar ")]' –

41

Se non avete accesso alla classi per modificare le proprietà, o non desiderano utilizzare sempre la stessa proprietà di ridenominazione, rinomina può essere fatto anche attraverso la creazione di un sistema di risoluzione personalizzato.

Ad esempio, se si dispone di una classe chiamata MyCustomObject, che ha una proprietà chiamata LongPropertyName, è possibile utilizzare un sistema di risoluzione personalizzato come questo ...

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

Quindi chiamare per la serializzazione e fornire il resolver

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

E il risultato sarà ridotto a { "Short": "valore prop"} invece di { "LongPropertyName": "valore prop"}

Maggiori informazioni resolver personalizzati here

+0

Questa è una soluzione migliore se la classe da serializzare viene dichiarata in un altro assembly che include una versione diversa del pacchetto Newtonsoft.Json. (potrebbe anche non generare alcun errore). Il 'DefaultContractResolver' deve essere messo nello stesso assembly dove viene usato il metodo JsonConvert.Serialize(). – Artemious

0

C'è ancora un altro modo per farlo, che sta utilizzando un particolare NamingStrategy, che può essere applicato a una classe o una proprietà da loro decorando con [JSonObject] o [JsonProperty].

ci sono strategie di denominazione predefinite come CamelCaseNamingStrategy, ma si può attuare il proprio.