2016-02-14 89 views
1

我也正在从超出了我的控制API调用返回了以下JSON对象:使用RestSharp到deserialise 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 
    }, 
    ... 
] 
} 

我已经在尝试将其deserialise到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到deserialise。当尝试使用RestSharp的IRestResponse<T> Execute<T>(RestRequest),我收到以下错误deserialisation:

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

我已经成功地从deserialise此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; } 
} 

任何人都可以在正确的方向指向我吗?谢谢!

回答

2

管理使其工作。该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类中添加一个DeserializeAs属性来BusinessGroups物业解决您的例子:

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

当你看到解决方案时,它非常有意义!谢谢!我应该注意到在我的实现中,我使用一个包装函数创建了'RestRequest',这个包装函数设置了'RootElement'属性(例如在这里指的是'GetBusinessGroupsRestResult') - 对于像AcquireSecurityTokenRest这样需要的其他API调用,会导致反序列化失败,为了使[DeserializeAs(Name =“GetBusinessGroupsRestResult”)]注释具有所需的效果,我必须将'RootElement'设置为'null'。 –

1

超过一个答案,忠告。为什么不使用Json.NET,而不是使用RESTSharp?

我碰到了RESTSharp的问题,这个问题在Json.NET中非常有效。

+0

我选择使用RestSharp,因为它允许我在一个地方处理HTTP请求的创建和执行以及响应的反序列化。例如:'var response = client.Execute (request);'。它以一种不错的,缓和的方式满足了我目前的要求。你遇到了什么样的问题?谢谢。 –

+0

@AdamJames对不起,如果我没有正确解释自己。我也使用RESTSharp来进行调用,但是一旦我得到响应,我就使用Json.NET来处理我收到的JSON响应。我一直遇到异常情况,反序列化JSON.NET处理的表面上适当的JSON响应,这种JSON.NET也更加强大和灵活。所以总结RESTSharp我发现它是我的首选库进行调用,然后我用另一个解释响应。 – xmorera

+0

谢谢你澄清 - 我有一个Pluralsight订阅,所以我一定会注意你的课程,并牢记你的方法。 –