Restsharp:使用比某些类更少/更多的字段反序列化json对象

时间:2014-08-07 00:25:46

标签: c# json serialization restsharp

我使用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忽略那些不在模型中的字段?

1 个答案:

答案 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依赖于它。