2011-09-04 15 views
7

Tengo el siguiente JSON regresar de un servicio de JavaJSON.NET Raíz Etiqueta y Deserialización

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

Tengo la siguiente clase C#

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

Sin embargo, debido a que la etiqueta raíz "prueba" es Enviado no puedo deserializar directamente con este

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

me parece que tengo para envolver la clase de la prueba dentro de otro clase para que esto funcione ¿Hay alguna manera fácil de evitar esto que no sea

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

Finalmente tengo una segunda pregunta. La mayoría de los servicios a los que llamo también pueden devolver un objeto Exception. Pensé que leería la etiqueta "raíz" del JSON para determinar cómo deserializar el objeto. ¿Cómo obtengo la primera etiqueta raíz y/o hay un método mejor y más elegante para manejar las excepciones de un servicio?

Gracias

Respuesta

1

Si no desea para crear un tipo de envoltura puede utilizar un tipo anónimo:

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

Si usted tiene más propiedades, como una excepción, es probablemente mejor para crear un tipo de envoltura.

1

escribir simplemente un envoltorio:

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

y luego Deserialize a este contenedor a buscar la instancia Test través de la propiedad Test:

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

La respuesta es en realidad un objeto que contiene el objeto Test. Entonces su modelo de objeto debería tener el mismo aspecto. Y puesto que la respuesta puede contener una excepción, debe reflejar eso también:

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

Esto supone que usted no sabe cómo será el aspecto Exception similares. Si lo hace, use un tipo concreto en lugar de JObject. A continuación, puede procesar el objeto Response según si Exception es null.

+0

Creo que esto podría funcionar muy bien si lo hago objeto genérico (para el objeto Prueba). Esta es una forma muy simple de analizar uno u otros objetos. Gracias – Shaun

2

tenía el mismo problema y realmente quería deshacerse de este 'contenedor', encontró esta solución, aunque es necesario utilizar una cadena adicional para encontrar el objeto raíz:

// 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>(); 
Cuestiones relacionadas