RestSharp JSON数组反序列化

13

我使用 JSON 格式发起了这个 RestSharp 查询:

var response = restClient.Execute<Report>(request);

我得到的响应包含这些数据

[
    {
        "Columns":
        [
            {"Name":"CameraGuid","Type":"Guid"},
            {"Name":"ArchiveSourceGuid","Type":"Guid"},
            {"Name":"StartTime","Type":"DateTime"},
            {"Name":"EndTime","Type":"DateTime"},
            {"Name":"TimeZone","Type":"String"},
            {"Name":"Capabilities","Type":"UInt32"}
        ],
        "Rows":
        [
            [
                "00000001-0000-babe-0000-00408c71be50",
                "3782fe37-6748-4d36-b258-49ed6a79cd6d",
                "2013-11-27T17:52:00Z",
                "2013-11-27T18:20:55.063Z",
                "Eastern Standard Time",
                2147483647
            ]
        ]
    }
]

我正在尝试将其反序列化为这组类:

public class Report
{
    public List<ReportResult> Results { get; set; }
}

public class ReportResult
{
    public List<ColumnField> Columns { get; set; }
    public List<RowResult>   Rows { get; set; }
}

public class ColumnField
{
    public string Name { get; set; }
    public string Type { get; set; }
}

public class RowResult
{
    public List<string> Elements { get; set; }
}

很不幸,结果数据为空并出现了以下异常:

无法将类型为'RestSharp.JsonArray'的对象强制转换为类型'System.Collections.Generic.IDictionary`2[System.String,System.Object]'。

我无法找出问题所在,非常感谢您提供帮助。

2个回答

23

试一下这个:

var response = restClient.Execute<List<ReportResult>>(request);

编辑

您还应将ReportResult更改为:

public class ReportResult
{
  public List<ColumnField> Columns { get; set; }
  public List<List<string>>   Rows { get; set; }
}

你可以摆脱ReportRowResult


我认为他也会因为“Elements”属性而遇到问题。 “Rows”应该是一个List<string>(除非您可以告诉JSON.net这就是它的方式,也许通过属性)。 - Tim S.
很好的发现,但是 Rows 应该是 List<List<string>> - Reda
使用IList<ReportResult>会导致编译错误:错误 CS0310:类型“System.Collections.Generic.IList<ReportResult>”必须具有公共的无参构造函数,以便在泛型类型或方法“ExecuteRequest<T>(RestSharp.RestRequest)”中用作参数“T”(CS0310)。 - BriocheBro
将其更改为 List<ReportResult>,我已相应地编辑答案。 - Reda
同时,尝试使用List<List<string>>仍然会出现相同的错误(无法转换...)。 - BriocheBro
Reda,你让我的一天变得美好!运行得非常顺利。干杯! - BriocheBro

0

还有一种方法是创建包装类:

public class ThirdPartySuggesters : List<ThirdPartySuggester> {}
var response = client.Execute<ThirdPartySuggesters>(request);

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