【问题标题】:Restsharp: Deserialize json object with less/more fields than some classRestsharp:反序列化具有比某些类更少/更多字段的 json 对象
【发布时间】:2014-08-07 00:25:46
【问题描述】:

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

【问题讨论】:

  • 或者您可以使用 client.Execute(request) 并从 Content 属性/字段解析
  • 我已经这样做了

标签: c# json serialization restsharp


【解决方案1】:

如果您返回的字段有很多变化,也许最好的方法是跳过静态 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 对其有依赖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    相关资源
    最近更新 更多