将Object反序列化为类不起作用

时间:2017-10-13 13:53:43

标签: c# json xamarin.forms

我正在尝试使用我从api返回的json对象使用DeserializeObject为令牌设置一个类。但是当我运行下面的代码时,它将所有值设置为null或0,而不是我从api获得的结果。

cs code

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

上课

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回复

"{\"code\":201,\"status\":\"Success\",\"message\":\"Object found\",\"data\":{\"StaffID\":14,\"StaffSurname\":\"Test\",\"StaffForename\":\"Test\",\"StaffEmail\":\"test@test.com\",\"PrimaryStaffRoleID\":5,\"TokenApi\":\"testToken\"}}"

3 个答案:

答案 0 :(得分:3)

首先,您要映射的数据位于json中名为Data的另一个属性中,其次,您的json没有名为Token的属性

问题实际上是你没有使用反映你的json的正确类型,意味着你没有正确的c#类型会被映射到json,你可以使用json2charp.com生成正确的类型,正确的类因为它是:

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; }
}

现在使用RootObject作为类型参数进行反序列化将完全正常,如:

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

更好的选择是使用QuickType.IO,它甚至可以用c#或他们支持的任何其他语言为您生成代码。

答案 1 :(得分:0)

如果您分析发布的JSON,那么您尝试反序列化的对象位于json的“data”属性中。

enter image description here

我建议您创建一个类来表示具有Data属性的JsonResponse。这将是您的Token

答案 2 :(得分:0)

您将检索到与此对象匹配的字符串

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

Token正在匹配json中的数据,所以

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

会更好。