C#でアプリを開発しており、C#用のアマデウスライブラリを使用しています。次のような AirportAutocomplete 応答を取得しようとしています。
[
{
"value": "MAD",
"label": "Adolfo Suárez Madrid–Barajas Airport [MAD]"
}
]
応答は括弧内にあるため、AiportAutocompleteResponse クラスだけでなく、AirportAutocompleteResponse クラスの配列またはリストに似ています。検索にさらに一致する場所がある場合、この例のような応答が返されます。
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を呼び出すために使用する関数:
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'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 <a href=\"http://jqueryui.com/autocomplete/\">JQuery UI Autocomplete</a> compatible format. <a href=\"https://github.com/amadeus-travel-innovation-sandbox/sandbox-content/blob/master/airport-autocomplete-template.html\">This sample implementation</a> 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
例外はこれを取得しています:
タイプ 'IO.Swagger.Client.ApiException' の未処理の例外が IO.Swagger.dll で発生しました 追加情報: 現在の JSON 配列 (例: [1, 2, 3]) をタイプ 'IO.Swagger.Model.AirportAutocompleteResponse ' これは、型が正しく逆シリアル化するために JSON オブジェクト (例: { "name":"value"}) を必要とするためです。このエラーを修正するには、JSON を JSON オブジェクト (例: { "name":"value"}) に変更するか、逆シリアル化された型を配列または List のようなコレクション インターフェイス (例: ICollection、IList) を実装する型に変更します。 JSON 配列から逆シリアル化されます。JsonArrayAttribute を型に追加して、強制的に JSON 配列から逆シリアル化することもできます。
AirportAutocomplete はクラスであり、応答は AirportAutocomplete クラスのリストまたは配列のように見えるため、前に例外について言及しましたが、上記のようにリストを使用して応答と配列を取得しようとしましたが、何も機能しません。私は以前にこの問題を抱えている人もいるようで、彼らはそれを解決します
Deserialize<AiportAutocomplete>
なので
Deserialize<List<AiportAutocomplete>>
しかし、私は API クラスを使用しているので、それを変更することはできません。独自のデシリアライザーを実行せずにこの修正を行う方法はありますか?
延長して申し訳ありませんが、役立つすべての情報を含めたいと思います。