RestSharp使用JSON数组进行反序列化

19

我有一个 JSON 响应,想要使用 RestSharp 进行反序列化,它看起来像这样:

{"devices":[{"device":{"id":7,"deviceid":"abc123","name":"Name"}},
            {"device":{"id":1,"deviceid":"def456","name":"Name"}}],
 "total":2,
 "start":0,
 "count":2}

基于一些建议,我尝试按照以下方式设置我的 POCO:

public class DevicesList
{
    public List<DeviceContainer> Devices;
}

public class DeviceContainer
{
    public Device Device;
}

public class Device
{
    public int Id { get; set; }
    public string DeviceId { get; set; }
    public string Name { get; set; }
}

然后我的执行看起来像这样:

// execute the request
var response = client.Execute<DevicesList>(request);

然而,response.Data 是 NULL,我已尝试其他变体但没有成功。

那么,在这种情况下应该使用什么类结构和映射?我还尝试过不用额外的 DeviceContainer 类。

感谢帮助。


也许你应该在deviceslist类中添加total、start和count属性。 - Vladimir
6个回答

33

当我的反序列化POCO包含一个数组时,我遇到了一个略微不同的问题。

将其从 Devices[] 更改为 List<Devices> 可以解决此问题,并且可以正确地反序列化。


谢谢,我刚刚遇到了这个问题,你的解决方案解决了它。 - mahonya
3
IEnumerable<>IList<>也不起作用。你需要使用List<> - Adam Szabo

19

RestSharp仅对属性进行操作,不会反序列化到字段中,请确保将您的DevicesDevice字段转换为属性。

另外,请仔细检查响应的Content-Type,如果响应是非默认类型,则RestSharp可能根本不使用JsonDeserializer。请参阅我的回答:RestSharp客户端在反序列化JSON响应时返回所有属性为空


就是这样。愚蠢的错误忘记了 { get; set; }。一旦我添加了它,它就完美地工作了。谢谢! - Garrett Vlieger

4

我遇到的问题是,如果你使用接口,比如IEnumerable或IList,它就无法工作,必须使用具体类型。

这种情况无法正常工作,而其他一些JSON序列化器(例如json.net)则可以。

public class DevicesList
{
    public IEnumerable<DeviceContainer> Devices { get; set; }
}

public class DeviceContainer
{
   ...
}

必须是这样的内容: ```

就必须是这个样子:

```
public class DevicesList
{
    public List<DeviceContainer> Devices { get; set; }
}

public class DeviceContainer
{
   ...
}

如果您正在使用较新版本的RESTSharp(例如不使用JSON.NET)进行JsonDeserializer,则此方法会有所帮助。 - Skyguard

2

RestSharp不支持DataAnnotation/DataMember,将您的属性重命名为无大写字母:

  • Devices -> devices
  • Device -> device

并且不要忘记{get; set;} ;).


0

我的问题是完全不同的,我天真地认为 JsonDeserializer 支持 JsonProperty 属性,但事实并非如此。因此,在尝试反序列化时出现了问题。

public class AvailableUserDatasApi
{
    [JsonProperty("available-user-data")]
    public List<AvailableUserDataApi> AvailableUserDatas { get; set; }
}

它失败了...但是将AvailableUserDatas更改为AvailableUserData就足以让事情开始运作。


0
在 .Net Core 中,你可以使用本地属性(因为 Newtonsoft 已被弃用):
public class AvailableUserDatasApi
{
    [JsonPropertyName("available-user-data")]
    public List<AvailableUserDataApi> AvailableUserDatas { get; set; }
}

然后,您可以使用任何您想要的属性名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接