使用 RestSharp 反序列化 JSON 数组

本文关键字:数组 JSON 反序列化 RestSharp 使用 | 更新日期: 2023-09-27 18:34:39

我从超出我控制的API调用返回了以下JSON对象:

{
  "GetBusinessGroupsRestResult": [
  {
    "BgId": 1,
    "NodeLevel": 1,
    "BusinessDescription": "Business Groups",
    "BusinessName": "Root",
    "nodegroupid": 2,
    "nodegroupname": "Root",
    "nodegroupdesc": "Root",
    "sorkkey": "Root",
    "Marked": 2
  },
  {
    "BgId": 2,
    "NodeLevel": 2,
    "BusinessDescription": "Business A",
    "BusinessName": "Business A",
    "ParentID": 1,
    "nodegroupid": 3,
    "nodegroupname": "Business A",
    "nodegroupdesc": "Business A",
    "sorkkey": "Business A",
    "Marked": 2
  },
  ...
 ]
}

我创建了以下类结构,试图将其反序列化为 C# 对象实例:

public class GetBusinessGroupsRestResult
{
    public List<BusinessGroup> BusinessGroups { get; set; }
}
public class BusinessGroup
{
    [DeserializeAs(Name = "BgId")]
    public int BusinessGroupId { get; set; }
    public int NodeLevel { get; set; }
    public string BusinessDescription { get; set; }
    public string BusinessName { get; set; }
    [DeserializeAs(Name = "ParentID")]
    public int ParentId { get; set; }
    [DeserializeAs(Name = "nodegroupid")]
    public int NodeGroupId { get; set; }
    [DeserializeAs(Name = "nodegroupname")]
    public string NodeGroupName { get; set; }
    [DeserializeAs(Name = "sorkkey")]
    public string SortKey { get; set; }
    public int Marked { get; set; }
}

我正在尝试使用 RestSharp 反序列化它,将 RootElement 指定为 GetBusinessGroupsRestResult 。尝试使用 RestSharp 的反序列化时 IRestResponse<T> Execute<T>(RestRequest) ,我收到以下错误:

System.InvalidCastException: Unable to cast object of type 'RestSharp.JsonArray' to type 'System.Collections.Generic.IDictionary`2[System.String,System.Object]'.

我已经设法反序列化来自此 API 的响应,这些响应之前不返回列表,例如:

{
  "AcquireSecurityTokenRestResult": {
    "SecurityToken": "SECURITY-TOKEN",
    "SessionLength": 600000,
    "APIVersion": "VERSION"
  }
}

使用以下 POCO:

public class AcquireSecurityTokenRestResult
{
    public string SecurityToken { get; set; }
    public int SessionLength { get; set; }
    [DeserializeAs(Name = "APIVersion")]
    public string ApiVersion { get; set; }
}

谁能在这里指出我正确的方向?谢谢!

使用 RestSharp 反序列化 JSON 数组

设法

让它工作。Execute部分:

var client = new RestClient("http://localhost:3000/");
var request = new RestRequest("main", Method.GET);
var response = client.Execute<RootObject>(request);

和类:

public class RootObject
{
    public List<BusinessGroup> GetBusinessGroupsRestResult { get; set; }
}
public class BusinessGroup
{
    [DeserializeAs(Name = "BgId")]
    public int BusinessGroupId { get; set; }
    public int NodeLevel { get; set; }
    public string BusinessDescription { get; set; }
    public string BusinessName { get; set; }
    [DeserializeAs(Name = "ParentID")]
    public int ParentId { get; set; }
    [DeserializeAs(Name = "nodegroupid")]
    public int NodeGroupId { get; set; }
    [DeserializeAs(Name = "nodegroupname")]
    public string NodeGroupName { get; set; }
    [DeserializeAs(Name = "nodegroupdesc")]
    public string NodeGroupDesc { get; set; }
    [DeserializeAs(Name = "sorkkey")]
    public string SortKey { get; set; }
    public int Marked { get; set; }
}

由于主响应是一个包含一个名为 GetBusinessGroupsRestResult 的数组的对象,因此在根对象中也需要它。

基本上,您可以通过向GetBusinessGroupsRestResult类中的 BusinessGroups 属性添加 DeserializeAs 属性来修复示例:

public class GetBusinessGroupsRestResult
{
    [DeserializeAs(Name = "GetBusinessGroupsRestResult")]
    public List<BusinessGroup> BusinessGroups { get; set; }
}

不仅仅是一个答案,更是一个建议。与其使用 RESTSharp,为什么不使用 Json.NET?

我在 RESTSharp 中遇到了问题,它在 Json.NET 中运行良好。