2011-01-12 12 views
10

Esiste un'API che non controllo, ma il cui output devo consumare con C#, preferibilmente utilizzando JSON.Net.Deserializzazione delle risposte JSON che contengono attributi che sono in conflitto con le parole chiave

Ecco un esempio di risposta:

[ 
    { 
     "media_id": 36867, 
     "explicit": 0 
    } 
] 

Avevo programmato di avere una classe in questo modo:

class Media { 
    public int media_id; 
    public int explicit; 
} 

E per deserializzare:

var l = JsonConvert.DeserializeObject<List<Media>>(s); 

Purtroppo, "esplicita" è una parola chiave C#, quindi non può essere compilata.

Il mio prossimo ipotesi è quella di modificare la classe:

class Media { 
    public int media_id; 
    public int explicit_; 
} 

... e in qualche modo mappare la risposta attributi agli attributi C#.

Come devo farlo, o sto andando totalmente a questo nel modo sbagliato?

In caso contrario, mi piacerebbe semplicemente ignorare l'espressione "esplicita" nella risposta, se c'è un modo per farlo?

risposta

17

non hanno usato JSON.Net, ma a giudicare dai documenti here, immagino non vi resta che fare quello che faresti con XmlSerialization: Aggiungere un attributo di raccontare come la proprietà JSON deve essere chiamato:

class Media { 
    [JsonProperty("media_id")] 
    public int MediaId; 
    [JsonProperty("explicit")] 
    public int Explicit; 
} 
+0

Cheers, ho saltato quello perché il ToC diceva "serializzazione" quando volevo la deserializzazione. Grazie per il puntatore. –

10

C# consente di definire i membri con i nomi parola riservata (per i casi di interoperabilità esattamente come questo) da loro fuga con una @, ad esempio,

class Media { 
    public int media_id; 
    public int @explicit; 
} 
Non

sicuro di come questo gioca con JSON.Net, ma vorrei immagina che dovrebbe funzionare (dal momento che @ è una fuga e non è in realtà parte del nome del campo).

+0

Capisco quello che stai dicendo, ma si può fornire un collegamento a ulteriori spiegazioni? Ho provato questo w/that change: "var x = new Media(); x.explicit = true;" Non sarebbe compilato, ma "x. @ Explicit = true" ha fatto. –

+0

Nel tuo codice, useresti "@explicit". Ma questo viene compilato con un nome effettivo di "esplicito" nel binario. Quindi il codice di serializzazione/deserializzazione di JSON.Net vedrebbe "esplicito", non "@explicit". Proprio come quando usi "\ n" nel tuo codice, ma viene compilato in un linefeed nel binario. –

+0

Vedo, grazie. Ancora accettata la risposta JSONProperty, poiché è specifica per questo dominio e gestisce anche casi più generali. –

1

Il codice seguente ha funzionato per me.

class JsonRpc { 
    public string id; 
    public string method; 
    public string[] @params; 
} 
JsonConvert.DeserializeObject<JsonRpc> (data) 

Grazie a tutti

Problemi correlati