我的类似乎没有使用API​​的JSON响应正确映射,而不是绑定

coo*_*eze 1 c# json json.net

我遇到了反序列化JSON响应的问题.

userResponse = JsonConvert.DeserializeObject<UserResponse>(result);
Run Code Online (Sandbox Code Playgroud)

json响应如下:

{
    "Results" : [
        {
            "Id" :  1,
            "Name" : "John",
            "Age"  : 50
        }
    ],
    "Paging" : {
        "TotalPages" : 5,
        "CurrentPage" : 1
    }
}
Run Code Online (Sandbox Code Playgroud)

我的UserResponse类假设绑定到上面的JSON,如下所示:

[DataContract]
public class UserResponse
{
    [DateMember(Name = "Results" )]
    public List<User> Results {get;set;}

    [DateMember(Name = "Paging" )]
    public Paging Paging {get;set;}

}

[DataContract]
public class User
{
    public int Id {get;set;}
    public string Name {get;set;}
    public int Age {get;set;}
}

[DataContract]
public class Paging
{
    public int TotalPages {get;set;}    
    public int CurrentPage {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

当前的UserResponse外观是否有任何问题?我不确定为什么它没有正确绑定.

userResponse对象返回非空,但属性的值为null.

Nko*_*osi 5

因为您正在使用,所以您DataContract还需要DataMember在其他类中包含该属性.使用DataContract是全有或全无.

如果您查看有关DataContract和DataMember属性的 Json.Net文档

[DataContract]
public class File
{
    // excluded from serialization
    // does not have DataMemberAttribute
    public Guid Id { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public int Size { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

请注意示例中的注释.

因此,要解决您的问题,请删除所有DataContractDataMember属性

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Paging
{
    public int TotalPages { get; set; }
    public int CurrentPage { get; set; }
}

public class UserResponse
{
    public List<User> Results { get; set; }
    public Paging Paging { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

或者让所有东西都适当地装饰各自的属性.

[DataContract]
public class User {
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public int Age { get; set; }
}

[DataContract]
public class Paging {
    [DataMember]
    public int TotalPages { get; set; }

    [DataMember]
    public int CurrentPage { get; set; }
}

[DataContract]
public class UserResponse {
    [DataMember]
    public List<User> Results { get; set; }

    [DataMember]
    public Paging Paging { get; set; }
}
Run Code Online (Sandbox Code Playgroud)