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

时间:2015-09-09 11:21:46

标签: c# json dynamic deserialization restsharp

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

/用户

{
    "response" : {
        "users": [{"name": "John"},{"name": "Jack"}]
    },
    "page" : { "current":1, "total":1}
}

/宠物

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

正如您可以在"响应"中看到属性名称财产变化。 如何使用RestSharp反序列化一般响应?我不想为每个资源编写一个Response类。

我编写了以下通用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.list属性相关联。 我怎么能这样做?

1 个答案:

答案 0 :(得分:4)

我开始说这根本不优雅:

您可以使用

获取原始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会保留您的姓名列表。这是丑陋的,不灵活的,我不推荐它。

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