Restsharp:反序列化json对象的字段比某些类少或多

本文关键字:字段 反序列化 json 对象 Restsharp | 更新日期: 2023-09-27 18:17:03

我正在使用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:反序列化json对象的字段比某些类少或多

如果您返回的字段有很多变化,也许最好的方法是跳过静态dto并反序列化到dynamic。以下要点提供了一个示例,说明如何通过创建自定义反序列化器来使用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依赖于它