.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.Net 的 SelectToken 方法,形如:
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; }
}
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册