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

本文关键字:反序列化 RestSharp 动态 json 属性 | 更新日期: 2023-09-27 18:11:48

我有一个web服务(我不能编辑)与这个结构:

<<p> /用户/strong>
{
    "response" : {
        "users": [{"name": "John"},{"name": "Jack"}]
    },
    "page" : { "current":1, "total":1}
}

/宠物

{
    "response" : {
        "pets": [{"name": "Fido"},{"name": "Tweety"}]
    },
    "page" : { "current":1, "total":1}
}

可以看到属性名在"response"属性中发生了变化。如何用RestSharp反序列化通用响应?我不想为每个资源都写一个Response类。

我编写了以下泛型响应类

class RestResponse{
    public ResponseBody response { get; set; }
    public ResponsePage page { get; set; }
}
class ResponseBody {
    public List<dynamic> resourceList { get; set; } 
}
class ResponsePage {
    public int current { get; set; }
    public int total { get; set; }
}
class User { public string name {get; set;} }
class Pet { public string name {get; set;} }

当然,RestSharp不能将动态json属性与ResponseBody链接。属性列表。我该怎么做呢?

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

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

您可以使用

获取原始JSON响应
RestResponse response = client.Execute(request);
var jsonString = response.Content; // raw content as string

从这里开始,您可以使用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"]);

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

最好还是使用聪明的继承和自定义类。它可读性更强响应对象可能不会只有一个属性,对吧?