C# 使用RestSharp反序列化JSON数组
我无法控制API调用返回的JSON对象如下:C# 使用RestSharp反序列化JSON数组,c#,arrays,json,deserialization,restsharp,C#,Arrays,Json,Deserialization,Restsharp,我无法控制API调用返回的JSON对象如下: { "GetBusinessGroupsRestResult": [ { "BgId": 1, "NodeLevel": 1, "BusinessDescription": "Business Groups", "BusinessName": "Root", "nodegroupid": 2, "nodegroupname": "Root", "nodegroupdesc": "Root
{
"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; }
}
我已经成功地从这个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; }
}
有人能给我指一下正确的方向吗?谢谢大家! 设法使它工作起来。
执行
部分:
var client = new RestClient("http://localhost:3000/");
var request = new RestRequest("main", Method.GET);
var response = client.Execute<RootObject>(request);
不仅仅是一个答案,一条建议。为什么不使用Json.NET而不用RESTSharp呢
我遇到了在Json.NET中运行出色的RESTSharp问题。当您看到解决方案时,它非常有意义!非常感谢。我应该注意到,在我的实现中,我使用一个包装函数创建了
RestRequest
,该包装函数设置RootElement
属性(例如,在这里设置GetBusinessGroupsRestResult
)-对于其他API调用,如AcquireSecurityTokenRest
,这是必需的,但在这里,它会导致反序列化失败,我必须将RootElement
设置为null
,以便[DeserializeAs(Name=“GetBusinessGroupsRestResult”)]
注释以达到预期效果。我选择使用RestSharp,因为它允许我在一个地方处理HTTP请求的创建和执行以及响应的反序列化。例如:var response=client.Execute(请求)代码>。它以一种优美、简洁的方式满足了我目前的要求。你遇到了什么样的问题?谢谢。@AdamJames如果我没有正确解释我自己,我很抱歉。我也使用RESTSharp进行调用,但一旦得到响应,我就使用Json.NET处理我收到的Json响应。我不断遇到异常,将响应反序列化到看似正确的JSON上,JSON.NET处理得很好,它也更强大、更灵活。总之,我发现它是我打电话的首选库,然后我用另一个来解释回复。谢谢你澄清这一点-我有一个Pluralsight订阅,所以我一定会关注你的课程,并记住你的方法。希望它对你有所帮助。当我同时使用这两个库时,它确实对我有帮助。
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; }
}
public class GetBusinessGroupsRestResult
{
[DeserializeAs(Name = "GetBusinessGroupsRestResult")]
public List<BusinessGroup> BusinessGroups { get; set; }
}