簡體   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