我使用Restsharp来反序列化一些web服务响应,但是,问题是有时这个web服务会发回一个带有更多字段的json响应。到目前为止,我已经设法通过向我的匹配模型添加所有可能的字段来解决此问题,但此Web服务将继续添加/删除其响应中的字段。
例如:
Json的回应有效:
{
"name": "Daniel",
"age": 25
}
匹配模型:
public class Person
{
public string name { get; set; }
public int age { get; set; }
}
这很好用:Person person = deserializer.Deserialize<Person>(response);
现在假设json响应是:
{
"name": "Daniel",
"age": 25,
"birthdate": "11/10/1988"
}
查看新字段 bithdate ?现在一切都出错了。有没有办法告诉restsharp忽略那些不在模型中的字段?
答案 0 :(得分:2)
如果您回来的字段有很多变化,最好的方法可能是跳过静态DTO并反序列化为dynamic
。这个gist提供了一个如何通过创建自定义反序列化器来使用RestSharp执行此操作的示例:
// ReSharper disable CheckNamespace
namespace RestSharp.Deserializers
// ReSharper restore CheckNamespace
{
public class DynamicJsonDeserializer : IDeserializer
{
public string RootElement { get; set; }
public string Namespace { get; set; }
public string DateFormat { get; set; }
public T Deserialize<T>(RestResponse response) where T : new()
{
return JsonConvert.DeserializeObject<dynamic>(response.Content);
}
}
}
用法:
// Override default RestSharp JSON deserializer
client = new RestClient();
client.AddHandler("application/json", new DynamicJsonDeserializer());
var response = client.Execute<dynamic>(new RestRequest("http://dummy/users/42"));
// Data returned as dynamic object!
dynamic user = response.Data.User;
更简单的替代方法是使用Flurl.Http(免责声明:我是作者),这是一个HTTP客户端库,默认情况下在未提供通用参数时反序列化为dynamic
:
dynamic d = await "http://api.foo.com".GetJsonAsync();
在这两种情况下,实际的反序列化都由Json.NET执行。使用RestSharp,您需要将包添加到您的项目中(尽管您很可能已经拥有它); Flurl.Http依赖于它。