[英]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
類中實現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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.