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

.NET 作者: Rector 1026阅读 0评论 0收藏 收藏本文

郑重申明:本文未经许可,禁止任何形式转载

.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的请求结果数据(JSON格式)动态反序列化属性?

发布于: 2018-01-06 09:03:09
分享扩散: