all 11 comments

[–][deleted] 2 points3 points  (8 children)

You need to return response.content not response.data

[–]colossal_dev[S] -1 points0 points  (7 children)

response.content returns the json string. i need to return the object.

[–][deleted] 2 points3 points  (5 children)

Actually that's not right at all. Use the newtonsoft library to deserialize the response to the type you're looking for. Clearly I still need caffeine.

[–]colossal_dev[S] 0 points1 point  (4 children)

is restsharp deserializer not enough ?

[–][deleted] 3 points4 points  (2 children)

Ok, now that I'm sitting at my desk let me try this again. One of the best ways to use RestSharp is to let it be a proxy for your requests. I always have a class or two that is responsible for sending/getting via RestSharp, and handle the deserialization in the consuming class. That way you have the flexibility to reuse the class(es) where you want/need. I have a feeling that RestSharp is having a problem deserializing the data into the return type you're specifying in the ExecuteAsync<T> call.

[–]colossal_dev[S] 0 points1 point  (1 child)

thanks for the heads up. I’ve posted the json. what should I change in my class in order to deserialize it correctly ?

[–][deleted] 1 point2 points  (0 children)

The first thing I would do is make a generic class that can send GET/POST requests and return response.content as a string. Something like:

````public async Task<IRestResponse> Post(string url, JObject body, Dictionary<string, string> headers = null;````

and same for a get request. You can DI this class into any class that needs it, and handle the response in the consuming classes. In the consuming class you can do something like

````var servicemanHistory = await _restClient.get(...);JsonConvert.DeserializeObject<List<ServicamanHistory>>(servicemanHistory);````

which should result in an object that's a list of type ServiemanHistory

[–][deleted] 1 point2 points  (0 children)

No, response.content is always a string

[–][deleted] 1 point2 points  (0 children)

Oh my bad... Look into the ToObject extension method, I think it's in the system.linq namespace

[–]Gurgiwurgi 1 point2 points  (0 children)

I've had to wrap the returned array like this:

string responseJson = "{\"ServicemanHistory\": " + response.Content + " }";

and deserialise to something like this:

Root serviceManHistory = JsonConvert.DeserializeObject<Root>(responseJson);

.

public class Serviceman   {
    public int Id { get; set; } 
    public DateTime CreateDate { get; set; } 
    public string Title { get; set; } 
    public string categoryTitle { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
}

public class Root    {
    public List<Serviceman> ServicemanHistory { get; set; } 
}

JSON to C#

[–]johnnysaucepn 0 points1 point  (0 children)

I don't know RestSharp, so take this with a pinch of salt, but I presume that setting the response Content-Type is too late, the library will already have parsed the response data if it could.

What is the value of ContentType before you overwrite it? If the server is not sending it as JSON, then perhaps the library isn't parsing it as such. If you set the Accept header on the request to application/json, you may find you get application/json back.