简体   繁体   中英

Using RestSharp to deserialise JSON array

I have the following JSON object being returned from an API call beyond my control:

{
  "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
  },
  ...
 ]
}

I have created the following class structure in an attempt to deserialise it into C# object instances:

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

I am trying to deserialise it using RestSharp , specifying the RootElement as GetBusinessGroupsRestResult . When attempting the deserialisation using RestSharp's IRestResponse<T> Execute<T>(RestRequest) , I recieve the following error:

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

I've managed to deserialise responses from this API that don't return lists before, for example:

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

With the following POCO:

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

Can anyone point me in the right direction here? Thank you!

Managed to make it work. The Execute part:

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

And the classes:

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

Since the main response is an object which contains an array called GetBusinessGroupsRestResult , you need that in your root object as well.

You can basically fix your example by adding a DeserializeAs attribute to the BusinessGroups property in your GetBusinessGroupsRestResult class:

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

More than an answer, piece of advice. Instead of using RESTSharp why don't you use Json.NET?

I ran into issues with RESTSharp that works wonderfully in Json.NET.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM