c# - 动态反序列化为 RestSharp 中的属性

标签 c# restsharp

我正在使用 Harvest API 并尝试尽可能简单地自动映射实体,不幸的是,当我执行类似 GET/projects 的请求时,它会生成如下结果:

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

在 RestSharp 中,我不能直接这样做:

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

因为它要查找名为 Project 的属性。所以我必须创建另一个具有该属性的类,并这样调用它:

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

我不想为每个实体都创建一个“容器”类,所以我想我找到了一个聪明的解决方案来创建一个我可以在所有实体上使用的类:

public class ListContainer<T> where T : IHarvestEntity
{
    public T Item { get; set; }
}

但是,当然,反序列化器不知道它需要将实体名称(或“Project”)映射到属性 Item。在 restsharp 文档中,我发现我可以使用 [DeserializeAs(Name = "CustomProperty")] 来告诉反序列化器将哪个字段映射到该属性。但是,属性只允许常量,这意味着我不能这样做:

[DeserializeAs(Name = typeof(T).FullName)]
public T Item { get; set; }

有人知道解决这个问题的巧妙方法吗?所以我不必创建 10 个不同的容器类?

最佳答案

我建议您使用 Json 的 XPath 等价物。使用 Json.NET,您可以 parse字符串并创建一个动态对象。

SelectToken您可以查询值,或使用 Linq .

代码看起来像这样(我没有测试):

// execute the request
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();

您可以根据需要对路径进行编码或配置。

--- 编辑---

这是我测试过的一个示例,将 json 字符串转换为项目列表。

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

关于c# - 动态反序列化为 RestSharp 中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30034771/

相关文章:

c# - 干净地处理舍入/累积错误

c# - Flipview 保存在内存中的项目

twilio - 是否可以使用 Twilio-csharp/TwilioRestClient 发送带有 SMSMessage 的 cookie?

c# - 如何将 cookie 容器与 RestSharp 和 ASP.NET session 一起使用?

restsharp - 将 IRestResponse 转换为 IRestResponse<T>

c# - 如何以功能方式获取中间金额列表?使用 LINQ?

c# - 通过 Google Calendar API v3 创建重复事件

c# - 从 C# 将字节数组插入 SQL Server 以及如何检索它

c# - 如何将值返回到异步方法中?

c# - 如何让 RestSharp 正确缩小压缩的 HTTP 响应?