C# Restsharp:反序列化json对象,其字段数比某些类少/多

C# Restsharp:反序列化json对象,其字段数比某些类少/多,c#,json,serialization,restsharp,C#,Json,Serialization,Restsharp,我使用Restsharp来反序列化一些webservice响应,然而,问题是有时候这个webservice会发回一个包含更多字段的json响应。到目前为止,我已经通过向匹配模型添加所有可能的字段来解决这个问题,但是这个web服务将继续从其响应中添加/删除字段 例如: 有效的Json响应: { "name": "Daniel", "age": 25 } 匹配模型: public class Person { public string name { get; set; }

我使用Restsharp来反序列化一些webservice响应,然而,问题是有时候这个webservice会发回一个包含更多字段的json响应。到目前为止,我已经通过向匹配模型添加所有可能的字段来解决这个问题,但是这个web服务将继续从其响应中添加/删除字段

例如:

有效的Json响应:

{
    "name": "Daniel",
    "age": 25
}
匹配模型:

public class Person
{
    public string name { get; set; }
    public int age { get; set; }
}
这很好:
Person=反序列化程序。反序列化(响应)

现在假设json响应是:

{
        "name": "Daniel",
        "age": 25,
        "birthdate": "11/10/1988"
}

请参见新字段bithdate?现在一切都出了问题。有没有办法告诉restsharp忽略那些不在模型中的字段

如果要返回的字段有那么多变化,最好的方法可能是跳过静态DTO,反序列化为
动态
。这提供了一个示例,说明如何通过创建自定义反序列化程序来使用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);
        }
    }
}

在这两种情况下,实际的反序列化都由执行。使用RestSharp,您需要将包添加到您的项目中(尽管您很有可能已经拥有了它);Flurl.Http对它有依赖性。

或者,您可以使用client.Execute(请求)和Content-property/field解析。我已经在这样做了
// 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;
dynamic d = await "http://api.foo.com".GetJsonAsync();