2012-06-18 56 views
9

Estoy tratando de hacer un ejemplo muy simple del uso del método Execute de RestSharp para consultar un punto final de reposo y serializar a un POCO. Sin embargo, todo lo que intento da como resultado un objeto response.Data que tiene todas las propiedades con un valor NULL.El cliente RestSharp devuelve todas las propiedades como nulas al deserializar la respuesta JSON

Aquí está la respuesta JSON:

{ 
    "Result": 
    { 
     "Location": 
     { 
      "BusinessUnit": "BTA", 
      "BusinessUnitName": "CASINO", 
      "LocationId": "4070", 
      "LocationCode": "ZBTA", 
      "LocationName": "Name of Casino" 
     } 
    } 
} 

Aquí está mi código de prueba

[TestMethod] 
    public void TestLocationsGetById() 
    { 
     //given 
     var request = new RestRequest(); 
     request.Resource = serviceEndpoint + "/{singleItemTestId}"; 
     request.Method = Method.GET; 
     request.AddHeader("accept", Configuration.JSONContentType); 
     request.RootElement = "Location"; 
     request.AddParameter("singleItemTestId", singleItemTestId, ParameterType.UrlSegment); 
     request.RequestFormat = DataFormat.Json; 

     //when 
     Location location = api.Execute<Location>(request);    

     //then 
     Assert.IsNotNull(location.LocationId); //fails - all properties are returned null 

    } 

Y aquí es mi código API

public T Execute<T>(RestRequest request) where T : new() 
    { 
     var client = new RestClient(); 
     client.BaseUrl = Configuration.ESBRestBaseURL; 

     //request.OnBeforeDeserialization = resp => { resp.ContentLength = 761; }; 

     var response = client.Execute<T>(request); 
     return response.Data; 
    } 

Y, por último, aquí está mi POCO

public class Location 
{   
    public string BusinessUnit { get; set; } 
    public string BusinessUnitName { get; set; } 
    public string LocationId { get; set; } 
    public string LocationCode { get; set; } 
    public string LocationName { get; set; } 
} 

Además, las propiedades ErrorException y ErrorResponse en la respuesta son NULL.

Esto parece un caso muy simple, pero he estado corriendo en círculos todo el día! Gracias.

+0

¿Qué sucede cuando llamas 'request.AddUrlSegment (" singleItemTestId ", singleItemTestId)' en lugar de la llamada que tienes que 'AddParameter'? –

Respuesta

8

¿Cuál es el Content-Type en la respuesta? Si no es un tipo de contenido estándar como "aplicación/json", etc., RestSharp no entenderá qué deserializador usar. Si es en realidad un tipo de contenido no "entiende" RestSharp (se puede verificar mediante la inspección de la Accept enviado en la solicitud), entonces se puede resolver esto haciendo:

client.AddHandler("my_custom_type", new JsonDeserializer()); 

EDIT:

Ok, lo siento, mirando el JSON de nuevo, necesita algo como:

public class LocationResponse 
    public LocationResult Result { get; set; } 
} 

public class LocationResult { 
    public Location Location { get; set; } 
} 

y luego hacer:

client.Execute<LocationResponse>(request); 
+0

El tipo de contenido es "application/json". ¿No debería esta línea: request.RootElement = "Location"; ¿elimina la necesidad del contenedor de objetos "LocationResponse" que sugirió? – smercer

+0

Hmmm, después de haber intentado lo que tu segunda edición me recomendó, funcionó, pero no estoy seguro de entender por qué, a menos que esté completamente mal entendido el propósito de la propiedad RootElement. ¡Bien gracias! – smercer

+3

El soporte 'RootElement' en JsonDeserializer solo parece ser compatible con la especificación de una propiedad en el objeto toplevel como elemento, p. "Resultado" en tu JSON. No hace una búsqueda más profunda en la jerarquía de objetos: https://github.com/restsharp/RestSharp/blob/master/RestSharp/Deserializers/JsonDeserializer.cs – Pete

Cuestiones relacionadas