首页 / .NET / 正文

.NET[C#]中如何从RestSharp的请求结果数据(JSON格式)动态反序列化属性?

5329 发布于: 2018-01-06 读完约需5分钟

.NET[C#]中如何从RestSharp的请求结果数据(JSON格式)动态反序列化属性?

问题描述

比如使用RestSharp发送请求,得到了如下的JSON字符串:

[{
    project: {
        name: "Test"
    }
},
{
    project: {
        name: "Test 2"
}]

在RestSharp C#中,是不能直接使用如下方法进行反序列化的:

client.Execute<List<Project>>(request)

那么,.NET[C#]中如何从RestSharp的请求结果数据(JSON格式)动态反序列化属性?

方案一

使用 JSON.NetSelectToken 方法,形如:

RestResponse response = client.Execute(request);
var content = response.Content; // raw content as string

JObject o = JObject.Parse(content);

IList<string> projectNames = o.SelectToken("project").Select(s => (string)s.name).ToList();

案例:

var projects = JArray.Parse(response.Content).Select(r => new Project(r["project"]["name"].Value<string>())).ToList();

方案二

使用 List<dynamic>,如:

var names = client.Execute<List<dynamic>>(request).Data.Select(
              item => item["project"]["name"]).ToList();

或者实现自己的映射(Map),如:

var projects = client.Execute<List<dynamic>>(request).Data.Select(
                 item => Map<Project>(item)).ToList();

映射方法如下:

public T Map<T>(dynamic item) where T : class
{
    // inline for clarity
    var mappings = new Dictionary<Type,Func<dynamic,object>>
        {
            { typeof(Project), map => new Project(map["project"]["name"]) }
        };

    return (T)mappings[typeof(T)].Invoke(item);
}

本文示例:

public class Project
{
    public Project(string name)
    {
        Name = name;
    }
    public string Name { get; set; }
}

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: .NET[C#]RestSharp的RestClient默认超时时间是多长?

下一篇: .NET[C#]使用RestSharp如何设置头部信息(Headers)的内容类型(Content-Type)?

本文永久链接码友网 » .NET[C#]中如何从RestSharp的请求结果数据(JSON格式)动态反序列化属性?

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册