2016-06-07 62 views
0

即時通訊在C#上開發應用程序,即時通訊使用C#的amadeus庫。 我試着去獲得AirportAutocomplete響應,看起來像這樣:艾瑪迪斯機場自動完成在C#上使用API​​#

[ { "value": "MAD", "label": "Adolfo Suárez Madrid–Barajas Airport [MAD]" } ]

因爲響應的括號內它不僅是一個AiportAutocompleteResponse類其更像AirportAutocompleteResponse類的數組或列表。如果有更多匹配的搜索,我會有一個響應,如this example

的AirportAutocompleteResponse類:

public partial class AirportAutocompleteResponse : IEquatable<AirportAutocompleteResponse> 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="AirportAutocompleteResponse" /> class. 
    /// </summary> 
    public AirportAutocompleteResponse() 
    { 

    } 


    /// <summary> 
    /// The 3 letter IATA location code of the given city or airport. You can use this as an input parameter for a flight low-fare or inspiration search. 
    /// </summary> 
    /// <value>The 3 letter IATA location code of the given city or airport. You can use this as an input parameter for a flight low-fare or inspiration search.</value> 
    [DataMember(Name="value", EmitDefaultValue=false)] 
    public string Value { get; set; } 


    /// <summary> 
    /// The name of this airport, in UTF-8 format, prefixed with the name of the city if it is not already incorporated in the name of the airport, and appended with the location's IATA code (as in value), enclosed in square brackets. 
    /// </summary> 
    /// <value>The name of this airport, in UTF-8 format, prefixed with the name of the city if it is not already incorporated in the name of the airport, and appended with the location's IATA code (as in value), enclosed in square brackets.</value> 
    [DataMember(Name="label", EmitDefaultValue=false)] 
    public string Label { get; set; } 



    /// <summary> 
    /// Returns the string presentation of the object 
    /// </summary> 
    /// <returns>String presentation of the object</returns> 
    public override string ToString() 
    { 
     var sb = new StringBuilder(); 
     sb.Append("class AirportAutocompleteResponse {\n"); 
     sb.Append(" Value: ").Append(Value).Append("\n"); 
     sb.Append(" Label: ").Append(Label).Append("\n"); 

     sb.Append("}\n"); 
     return sb.ToString(); 
    } 

    /// <summary> 
    /// Returns the JSON string presentation of the object 
    /// </summary> 
    /// <returns>JSON string presentation of the object</returns> 
    public string ToJson() 
    { 
     return JsonConvert.SerializeObject(this, Formatting.Indented); 
    } 

    /// <summary> 
    /// Returns true if objects are equal 
    /// </summary> 
    /// <param name="obj">Object to be compared</param> 
    /// <returns>Boolean</returns> 
    public override bool Equals(object obj) 
    { 
     // credit: http://stackoverflow.com/a/10454552/677735 
     return this.Equals(obj as AirportAutocompleteResponse); 
    } 

    /// <summary> 
    /// Returns true if AirportAutocompleteResponse instances are equal 
    /// </summary> 
    /// <param name="other">Instance of AirportAutocompleteResponse to be compared</param> 
    /// <returns>Boolean</returns> 
    public bool Equals(AirportAutocompleteResponse other) 
    { 
     // credit: http://stackoverflow.com/a/10454552/677735 
     if (other == null) 
      return false; 

     return 
      (
       this.Value == other.Value || 
       this.Value != null && 
       this.Value.Equals(other.Value) 
      ) && 
      (
       this.Label == other.Label || 
       this.Label != null && 
       this.Label.Equals(other.Label) 
      ); 
    } 

    /// <summary> 
    /// Gets the hash code 
    /// </summary> 
    /// <returns>Hash code</returns> 
    public override int GetHashCode() 
    { 
     // credit: http://stackoverflow.com/a/263416/677735 
     unchecked // Overflow is fine, just wrap 
     { 
      int hash = 41; 
      // Suitable nullity checks etc, of course :) 

      if (this.Value != null) 
       hash = hash * 59 + this.Value.GetHashCode(); 

      if (this.Label != null) 
       hash = hash * 59 + this.Label.GetHashCode(); 

      return hash; 
     } 
    } 

} 

並採用調用API函數IM:

public AirportAutocompleteResponse AirportAutocomplete (string apikey, string term) 
    { 
     ApiResponse<AirportAutocompleteResponse> response = AirportAutocompleteWithHttpInfo(apikey, term); 
     return response.Data; 
    } 

    /// <summary> 
    /// The Airport Autocomplete API provides a simple means to find an IATA location code for flight search based on a city or airport name. The API is fully JQuery-Autocomplete compatible to enable you to quickly build a drop-down list for your users to find the right airport easily. Given the start of any word in an airport&#39;s official name, a city name, or the start of an IATA code, this API provides the full name and IATA location code of the city or airport, for use in flight searches. Only major cities and civilian airports with several commercial flights per week are included by default. The response provides up to 20 possible matches, sorted by importance, in a &lt;a href=\&quot;http://jqueryui.com/autocomplete/\&quot;&gt;JQuery UI Autocomplete&lt;/a&gt; compatible format. &lt;a href=\&quot;https://github.com/amadeus-travel-innovation-sandbox/sandbox-content/blob/master/airport-autocomplete-template.html\&quot;&gt;This sample implementation&lt;/a&gt; using JQuery UI may help. This API uses data from the OpenTravelData project, see https://github.com/opentraveldata/opentraveldata/blob/master/opentraveldata/optd_por_public.csv.\n\nThe value returned is the IATA location code. The label returned is always in UTF-8 format, with the airport official name (which is often in the native language), in the format of English City Name (if not already included in the airport name). 
    /// </summary> 
    /// <param name="apikey">API Key provided for your account, to identify you for API access</param> 
    /// <param name="term">Search term that should represent some part of a city or airport name.</param> 
    /// <returns>ApiResponse of AirportAutocompleteResponse</returns> 
    public ApiResponse<AirportAutocompleteResponse> AirportAutocompleteWithHttpInfo (string apikey, string term) 
    { 

     // verify the required parameter 'apikey' is set 
     if (apikey == null) 
      throw new ApiException(400, "Missing required parameter 'apikey' when calling DefaultApi->AirportAutocomplete"); 

     // verify the required parameter 'term' is set 
     if (term == null) 
      throw new ApiException(400, "Missing required parameter 'term' when calling DefaultApi->AirportAutocomplete"); 


     var path_ = "/airports/autocomplete"; 

     var pathParams = new Dictionary<String, String>(); 
     var queryParams = new Dictionary<String, String>(); 
     var headerParams = new Dictionary<String, String>(Configuration.DefaultHeader); 
     var formParams = new Dictionary<String, String>(); 
     var fileParams = new Dictionary<String, FileParameter>(); 
     Object postBody = null; 

     // to determine the Content-Type header 
     String[] httpContentTypes = new String[] { 

     }; 
     String httpContentType = Configuration.ApiClient.SelectHeaderContentType(httpContentTypes); 

     // to determine the Accept header 
     String[] httpHeaderAccepts = new String[] { 
      "application/json" 
     }; 
     String httpHeaderAccept = Configuration.ApiClient.SelectHeaderAccept(httpHeaderAccepts); 
     if (httpHeaderAccept != null) 
      headerParams.Add("Accept", httpHeaderAccept); 

     // set "format" to json by default 
     // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json 
     pathParams.Add("format", "json"); 

     if (apikey != null) queryParams.Add("apikey", Configuration.ApiClient.ParameterToString(apikey)); // query parameter 
     if (term != null) queryParams.Add("term", Configuration.ApiClient.ParameterToString(term)); // query parameter 







     // make the HTTP request 
     IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, 
      Method.GET, queryParams, postBody, headerParams, formParams, fileParams, 
      pathParams, httpContentType); 

     int statusCode = (int) response.StatusCode; 

     if (statusCode >= 400) 
      throw new ApiException (statusCode, "Error calling AirportAutocomplete: " + response.Content, response.Content); 
     else if (statusCode == 0) 
      throw new ApiException (statusCode, "Error calling AirportAutocomplete: " + response.ErrorMessage, response.ErrorMessage); 

     return new ApiResponse<AirportAutocompleteResponse>(statusCode, 
      response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), 
      (AirportAutocompleteResponse) Configuration.ApiClient.Deserialize(response, typeof(AirportAutocompleteResponse))); 

    } 

我想要做它來檢索響應的信息,所以我可以用它什麼後來這是什麼我嘗試到現在:

 string apiKey = "MyApiKey"; //Not shown for obvious reasons 
     DefaultApi Amadeus = new DefaultApi("https://api.sandbox.amadeus.com/v1.2");  


     AirportAutocompleteResponse response = Amadeus.AirportAutocomplete(apiKey, "adolfo suarez");     
     textBox3.Text = response.ToString(); 




     /**********************TRIED*************************/ 

     /*****USING A LIST*****/ 
     /* 
     List<AirportAutocompleteResponse> response = Amadeus.AirportAutocomplete(apiKey, "adolfo suarez");  
     textBox3.Text = response.ToString(); 
     */ //Does not compile since the response its not a list 



     /*****AS ARRAY*****/ 
     //AirportAutocompleteResponse[] response = Amadeus.AirportAutocomplete(apiKey, "adolfo suarez"); 
     //textBox3.Text = response.ToString(); //Doesnt work neither 



     /*****AS STRING*****/ 

     /* 
     string response = Amadeus.AirportAutocomplete(apiKey, "adolfo suarez").ToString();  
     textBox3.Text = response.ToString(); 
     */ //DOESNT WORK 

異常即時獲取它的t他的:

在IO.Swagger.dll中發生未處理的異常類型'IO.Swagger.Client.ApiException' 附加信息:無法反序列化當前的JSON數組(例如, [1,2,3])轉換爲'IO.Swagger.Model.AirportAutocompleteResponse'類型,因爲該類型需要JSON對象(例如{「name」:「value」}) 才能正確反序列化。 要修復此錯誤,請將JSON更改爲JSON對象(例如{「name」:「value」})或將反序列化類型更改爲實現集合接口(例如ICollection,IList)的數組或類型,如列表 可以從JSON數組中反序列化。 JsonArrayAttribute也可以添加到類型中,以強制它從JSON數組反序列化。

由於AirportAutocomplete它的一個類和響應似乎是一個AirportAutocomplete類的列表或數組我得到了前面提到的異常,ive嘗試使用列表來獲取上面顯示的響應和數組,但沒有任何工作。香港專業教育學院之前,似乎有這個問題的一些人,他們解決它通過

Deserialize<AiportAutocomplete> 

Deserialize<List<AiportAutocomplete>> 

但由於IM usign API的類我不能改變這種狀況。 ¿有沒有辦法得到這個修復程序,而不必做我自己的反序列化器?

對不起,我想包括所有的信息,可以幫助。

+1

它聽起來像API類過時,如果它不適用於真正的API是開箱即用的。我建議你用Amadeus提交一個錯誤。 – Rup

回答