如何使用 RestSharp 实现反序列化规则

本文关键字:反序列化 规则 实现 RestSharp 何使用 | 更新日期: 2023-09-27 18:34:04

我正在尝试使用RestSharp为Capsule CRM API编写包装器。

我对他们的 API 服务有问题。当存在数据时,它返回 JSON 对象,当 CRM 上没有对象时,它返回空字符串。

例如,查看联系人:

{"organisation":{"id":"97377548","contacts":"","pictureURL":"","createdOn":"2016-02-08T14:27:12Z","updatedOn":"2016-02-08T14:27:12Z","lastContactedOn":"2013-12-03T21:00:00Z","name":"some name"}}
{"organisation":{"id":"97377548","contacts":{"email":{"id":"188218414","emailAddress":"someemail"},"phone":{"id":"188218415","type":"Direct","phoneNumber":"phone"}},"pictureURL":"","createdOn":"2016-02-08T14:27:12Z","updatedOn":"2016-02-08T14:27:12Z","lastContactedOn":"2013-12-03T21:00:00Z","name":"some name"}}

要匹配我有班级的联系人:

public class Contacts
{
    public List<Address> Address { get; set; }
    public List<Phone> Phone { get; set; }
    public List<Website> Website { get; set; }
    public List<Email> Email { get; set; }
}

和属性 我正在尝试匹配的类联系人:

public Contacts Contacts { get; set; }

当 API 返回 JSON 对象时一切正常,但是当我从 API 获得联系人的空字符串时,我会收到异常:

无法将类型为"System.String"的对象强制转换为类型 'System.Collections.Generic.IDictionary'2[System.String,System.Object]'.

如何避免这个问题?有没有办法根据从 API 返回的数据进行条件匹配?我怎么能告诉 RestSharp 不要抛出异常,如果它不匹配,就跳过属性?

如何使用 RestSharp 实现反序列化规则

由于您可以控制 API,因此不要在响应中返回"contacts":"",而是返回 "contacts":"{}",这应该可以避免您的错误。


如果无法更改来自 API 的响应,则需要实现自定义序列化程序,因为 RestSharp 不支持对象 " 。

本文总结了如何使用 JSON.Net 作为序列化程序,这将使您能够使用反序列化所需的任何规则。

文章摘要

首先,在 NewtonsoftJsonSerializer 类中实现 ISerializer 和 IDeserializer 接口。这将使您能够完全控制 JSON 的去剥离方式,因此您可以使 " 适用于空对象。

然后,要在请求中使用它:

 private void SetJsonContent(RestRequest request, object obj)
 {
     request.RequestFormat = DataFormat.Json;
     request.JsonSerializer = new NewtonsoftJsonSerializer();
     request.AddJsonBody(obj);
 }

并在响应中使用它:

private RestClient CreateClient(string baseUrl)
{
    var client = new RestClient(baseUrl);
    // Override with Newtonsoft JSON Handler
    client.AddHandler("application/json", new NewtonsoftJsonSerializer());
    client.AddHandler("text/json", new NewtonsoftJsonSerializer());
    client.AddHandler("text/x-json", new NewtonsoftJsonSerializer());
    client.AddHandler("text/javascript", new NewtonsoftJsonSerializer());
    client.AddHandler("*+json", new NewtonsoftJsonSerializer());
    return client;
}