如何在C#中使用RestSharp反序列化动态json属性?

Ste*_*ale 2 c# json dynamic restsharp deserialization

我有一个具有以下结构的Web服务(我无法编辑):

/用户

{
    "response" : {
        "users": [{"name": "John"},{"name": "Jack"}]
    },
    "page" : { "current":1, "total":1}
}
Run Code Online (Sandbox Code Playgroud)

/宠物

{
    "response" : {
        "pets": [{"name": "Fido"},{"name": "Tweety"}]
    },
    "page" : { "current":1, "total":1}
}
Run Code Online (Sandbox Code Playgroud)

如您所见,“响应”属性中的属性名称已更改。如何使用RestSharp反序列化一般响应?我不想为每个资源编写一个Response类。

我编写了以下通用Response类

{
    "response" : {
        "users": [{"name": "John"},{"name": "Jack"}]
    },
    "page" : { "current":1, "total":1}
}
Run Code Online (Sandbox Code Playgroud)

当然,RestSharp无法将动态json属性与ResponseBody.list属性链接。我怎样才能做到这一点?

noz*_*man 5

我首先要说一点都不优雅:

您可以使用获取原始的JSON响应

RestResponse response = client.Execute(request);
var jsonString = response.Content; // raw content as string
Run Code Online (Sandbox Code Playgroud)

从那里开始,您可以像这样使用JSON.NET查询它:

var jObject = JObject.Parse(jsonString);
// this could probably be written nicer, but you get the idea...
var resources = jObject ["response"]["users"].Select(t => t["name"]);
Run Code Online (Sandbox Code Playgroud)

resources然后将保存您的姓名列表。这是丑陋的,不灵活的,我不建议这样做。

更好地坚持聪明的继承和自定义类。它的可读性更高,您的响应对象可能不会全部只有一个属性,对吗?

  • 实际上我是在寻求一种方法来避免像这样的不优雅的方法:-p (2认同)