繁体   English   中英

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

[英]How to implement deserialization rules with RestSharp?

我正在尝试使用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不抛出异常,只是跳过属性,如果它不匹配?

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


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

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

文章摘要

首先,在NewtonsoftJsonSerializer类中实现ISerializerIDeserializer接口。 这将使您完全控制JSON的desierialized,因此您可以使“”为空对象工作。

然后,在请求中使用它:

 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM