我正在使用 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/