2011-09-04 21 views
7

Ho il seguente JSON ritorno da un servizio JavaJSON.NET Radice e deserializzazione

{"Test":{ 
    "value": 1, 
    "message": "This is a test" 
    }} 

Ho la seguente classe C#

class Test { 
    public int value { get; set; } 
    public String message { get; set; } 
} 

Tuttavia, perché il tag radice "Test" è restituito non posso deserializzare direttamente questo con

Test deserializedTest = JsonConvert.DeserializeObject<Test>(jsonString); 

trovo devo avvolgere la classe di test all'interno di un altro classe per farlo funzionare. C'è un modo semplice per evitare questo diverso da

JToken root = JObject.Parse(jsonString); 
JToken testToken = root["Test"]; 
Test deserializedTest = JsonConvert.DeserializeObject<Test>(testToken.toString()); 

Finalmente ho una seconda domanda. La maggior parte dei servizi che sto chiamando possono restituire anche un oggetto Exception. Ho pensato di leggere il tag "root" del JSON per determinare come deserializzare l'oggetto. Come posso ottenere il primo tag root e/o esiste un metodo migliore e più elegante per gestire le eccezioni da un servizio?

Grazie

risposta

1

Se non si desidera per creare un tipo di involucro è possibile utilizzare un tipo anonimo:

var test = 
    JsonConvert.DeserializeAnonymousType(response.Content, new { Test = new Test()}).Test; 

Se si dispone di più proprietà, come un'eccezione, probabilmente è meglio creare un tipo di involucro.

1

sufficiente scrivere un involucro:

public class Wrapper 
{ 
    public Test Test { get; set; } 
} 

e quindi deserializzare a questo involucro a prendere l'istanza Test tramite la proprietà Test:

Test deserializedTest = JsonConvert.DeserializeObject<Wrapper>(jsonString).Test; 
2

La risposta è in realtà un oggetto che contiene l'oggetto Test. Quindi il tuo modello di oggetto dovrebbe apparire lo stesso. E dal momento che la risposta può contenere un'eccezione, si dovrebbe riflettere sul fatto che troppo:

class Response 
{ 
    public Test Test { get; set; } 
    public JObject Exception { get; set; } 
} 

Questo presuppone che non si sa come sarà l'aspetto Exception simili. Se lo fai, usa un tipo concreto invece di JObject. È quindi possibile elaborare l'oggetto Response in base al fatto che Exception è null.

+0

Penso che questo potrebbe funzionare correttamente se lo faccio oggetto generico (per l'oggetto Test). Questo è un modo molto semplice per analizzare uno o gli altri oggetti. Grazie – Shaun

2

avuto lo stesso problema e voleva sbarazzarsi di questo 'contenitore', ha trovato questa soluzione se è necessario utilizzare una stringa in più per trovare l'oggetto root:

// Container I wanted to discard 
public class TrackProfileResponse 
{ 
    [JsonProperty("response")] 
    public Response Response { get; set; } 
} 

// Code for discarding it 
var jObject = JObject.Parse(s); 
var jToken = jObject["response"]; 
var response = jToken.ToObject<Response>(); 
Problemi correlati