Gurpreet Bhopal
Gurpreet Bhopal

Reputation: 73

Deserialize Object into a class does not work

I am trying to set a class for a token using DeserializeObject from the json object i get back from my api. However when i run the below code it sets all the values to null or 0, not the result i am getting from the api.

cs code

var resultString = await result.Content.ReadAsStringAsync();
var post = JsonConvert.DeserializeObject<Token>(resultString);

class

public class Token : ContentPage
{
    public int StaffID { get; set; }
    public string TokenApi { get; set; }
    public string StaffForename { get; set; }
    public string StaffSurname { get; set; }
    public string StaffEmail { get; set; }
    public int PrimaryStaffRoleID { get; set; }
}

JSON response

"{\"code\":201,\"status\":\"Success\",\"message\":\"Object found\",\"data\":{\"StaffID\":14,\"StaffSurname\":\"Test\",\"StaffForename\":\"Test\",\"StaffEmail\":\"[email protected]\",\"PrimaryStaffRoleID\":5,\"TokenApi\":\"testToken\"}}"

Upvotes: 0

Views: 236

Answers (3)

Ehsan Sajjad
Ehsan Sajjad

Reputation: 62498

Firstly the data which you are trying to map is inside another property in your json called Data and secondly your json does not have a property with name Token

The problem actually is you are not using the correct type that reflects your json, means you don't have correct c# type which would get mapped to json, you can generate correct types using json2charp.com , the correct classes for it are :

public class Data
{
    public int StaffID { get; set; }
    public string StaffSurname { get; set; }
    public string StaffForename { get; set; }
    public string StaffEmail { get; set; }
    public int PrimaryStaffRoleID { get; set; }
    public string TokenApi { get; set; }
}

public class RootObject
{
    public int code { get; set; }
    public string status { get; set; }
    public string message { get; set; }
    public Data data { get; set; }
}

Now deserializing using RootObject as type parameter would work perfectly fine like:

var resultString = await result.Content.ReadAsStringAsync();
var post = JsonConvert.DeserializeObject<RootObject>(resultString);

A more good option is to use QuickType.IO which would even generate code for you in c# or any other language that they are supporting.

Upvotes: 3

User.Anonymous
User.Anonymous

Reputation: 1726

You are retrieved a string that match this object

public string code {get;set;}
public string Success {get;set;} ...

And Token is matching data in json, so

var post = JsonConvert.DeserializeObject<Token>(resultString.data);

would be better.

Upvotes: 0

Bruno Avelar
Bruno Avelar

Reputation: 670

If you analyze the JSON that you posted, the object that you're trying to Deserialize is inside the "data" property of your json.

enter image description here

I suggest you creating a class to represent the JsonResponse with a Data property. This will be your Token

Upvotes: 0

Related Questions