我正在尝试使用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获取联系人的空字符串时出现异常:
无法转换类型为&#39; System.String&#39;的对象输入 &#39; System.Collections.Generic.IDictionary`2 [System.String,System.Object的]&#39;
如何避免这个问题? 有没有办法根据API返回的数据进行条件匹配? 我如何判断RestSharp不会抛出异常,如果它不匹配就跳过属性?
答案 0 :(得分:3)
由于您可以控制您的API,而不是在回复中返回"contacts":""
,而是返回"contacts":"{}"
,这样可以避免您的错误。
如果您无法更改API的响应,则需要实现自定义序列化程序,因为RestSharp不支持“”对象。
This article总结了如何使用JSON.Net作为序列化程序,这使您可以使用所需的规则进行反序列化。
文章摘要
首先,在NewtonsoftJsonSerializer
类中实现ISerializer和IDeserializer接口。这将使您可以完全控制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;
}