У меня проблема в том, что мне нужно проанализировать ответы нескольких типов объектов из API CheckWX.com. (см. https://api.checkwx.com/). На данный момент в моем коде ScalarsConverterFactory
и GSONConverterFactory
. Мой конвертер Gson работает нормально без ошибок. Однако, когда я получаю сообщение об ошибке, кажется, что синтаксический анализ завершается неудачно, и onFailure Я должен сообщить обо всех успешных станциях, а также о тех, которые потерпели неудачу. Как я могу обработать это в Retrofit?
Вот ответ на ошибку запроса одной станции:
{
"results":1,
"data":[
"KNZL Invalid Station ICAO"
]
}
Вот ответ на запрос станции без ошибки:
{
"results":1,
"data":[
{
"icao":"KAJO",
"name":"Corona Municipal",
"observed":"03-11-2018 @ 22:56Z",
"raw_text":"KAJO 032256Z AUTO 28010KT 10SM CLR 31/07 A2991 RMK AO2 SLP135 T03060072 $",
"barometer":{
"hg":29.91,
"kpa":101.29000000000001,
"mb":1013.5
},
"clouds":[
{
"code":"CLR",
"text":"Clear skies",
"base_feet_agl":0,
"base_meters_agl":0
}
],
"dewpoint":{
"celsius":7,
"fahrenheit":45
},
"elevation":{
"feet":535,
"meters":163
},
"flight_category":"VFR",
"humidity_percent":22,
"temperature":{
"celsius":31,
"fahrenheit":88
},
"visibility":{
"miles":"10",
"meters":"16,093"
},
"wind":{
"degrees":280,
"speed_kts":10,
"speed_mph":12,
"speed_mps":5
}
}
]
}
Вот ответ для успешной работы одной станции и ошибки одной станции:
{
"results":2,
"data":[
{
"icao":"KAJO",
"name":"Corona Municipal",
"observed":"03-11-2018 @ 22:56Z",
"raw_text":"KAJO 032256Z AUTO 28010KT 10SM CLR 31/07 A2991 RMK AO2 SLP135 T03060072 $",
"barometer":{
"hg":29.91,
"kpa":101.29000000000001,
"mb":1013.5
},
"clouds":[
{
"code":"CLR",
"text":"Clear skies",
"base_feet_agl":0,
"base_meters_agl":0
}
],
"dewpoint":{
"celsius":7,
"fahrenheit":45
},
"elevation":{
"feet":535,
"meters":163
},
"flight_category":"VFR",
"humidity_percent":22,
"temperature":{
"celsius":31,
"fahrenheit":88
},
"visibility":{
"miles":"10",
"meters":"16,093"
},
"wind":{
"degrees":280,
"speed_kts":10,
"speed_mph":12,
"speed_mps":5
}
},
"CYPG METAR Currently Unavailable"
]
}
А вот ответ для нескольких успехов и ошибок станции:
{
"results":5,
"data":[
{
"icao":"KAJO",
"name":"Corona Municipal",
"observed":"03-11-2018 @ 22:56Z",
"raw_text":"KAJO 032256Z AUTO 28010KT 10SM CLR 31/07 A2991 RMK AO2 SLP135 T03060072 $",
"barometer":{
"hg":29.91,
"kpa":101.29000000000001,
"mb":1013.5
},
"clouds":[
{
"code":"CLR",
"text":"Clear skies",
"base_feet_agl":0,
"base_meters_agl":0
}
],
"dewpoint":{
"celsius":7,
"fahrenheit":45
},
"elevation":{
"feet":535,
"meters":163
},
"flight_category":"VFR",
"humidity_percent":22,
"temperature":{
"celsius":31,
"fahrenheit":88
},
"visibility":{
"miles":"10",
"meters":"16,093"
},
"wind":{
"degrees":280,
"speed_kts":10,
"speed_mph":12,
"speed_mps":5
}
},
{
"icao":"KBIL",
"name":"Billings Logan International",
"observed":"03-11-2018 @ 22:53Z",
"raw_text":"KBIL 032253Z 25006KT 10SM -RA BKN043 BKN050 OVC120 05/01 A3007 RMK AO2 RAB41 SLP196 P0000 T00500011",
"barometer":{
"hg":30.07,
"kpa":101.83,
"mb":1019.6
},
"ceiling":{
"code":"BKN",
"text":"Broken",
"feet_agl":4300,
"meters_agl":1310.6400000000001
},
"clouds":[
{
"code":"BKN",
"text":"Broken",
"base_feet_agl":4300,
"base_meters_agl":1310.6400000000001
},
{
"code":"BKN",
"text":"Broken",
"base_feet_agl":5000,
"base_meters_agl":1524
},
{
"code":"OVC",
"text":"Overcast",
"base_feet_agl":12000,
"base_meters_agl":3657.6000000000004
}
],
"conditions":[
{
"code":"RA",
"prefix":"-",
"text":"Light Rain"
}
],
"dewpoint":{
"celsius":1,
"fahrenheit":34
},
"elevation":{
"feet":3579,
"meters":1091
},
"flight_category":"VFR",
"humidity_percent":76,
"rain_in":0.0050000000000000001,
"temperature":{
"celsius":5,
"fahrenheit":41
},
"visibility":{
"miles":"10",
"meters":"16,093"
},
"wind":{
"degrees":250,
"speed_kts":6,
"speed_mph":7,
"speed_mps":3
}
},
{
"icao":"KSAN",
"name":"San Diego International",
"observed":"03-11-2018 @ 22:51Z",
"raw_text":"KSAN 032251Z 29006KT 10SM FEW004 SCT250 24/16 A2993 RMK AO2 SLP135 T02390156",
"barometer":{
"hg":29.93,
"kpa":101.34999999999999,
"mb":1013.5
},
"clouds":[
{
"code":"FEW",
"text":"Few",
"base_feet_agl":400,
"base_meters_agl":121.92
},
{
"code":"SCT",
"text":"Scattered",
"base_feet_agl":25000,
"base_meters_agl":7620
}
],
"dewpoint":{
"celsius":16,
"fahrenheit":61
},
"elevation":{
"feet":39,
"meters":12
},
"flight_category":"VFR",
"humidity_percent":61,
"temperature":{
"celsius":24,
"fahrenheit":75
},
"visibility":{
"miles":"10",
"meters":"16,093"
},
"wind":{
"degrees":290,
"speed_kts":6,
"speed_mph":7,
"speed_mps":3
}
},
"CYPG METAR Currently Unavailable",
"KGNG METAR Currently Unavailable"
]
}
Вот код моего модифицированного клиента:
retrofit = new Retrofit.Builder().baseUrl(baseUrl)
.client(getHttpClient())
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
Как я уже сказал, мне нужно знать, как правильно проанализировать строки ошибок в ответе: для пояснения приведена ошибка:
CheckWXApi: onFailure: java.lang.IllegalStateException: Expected
BEGIN_OBJECT but was STRING at line 1 column 755 path $.data[1],
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was
STRING at line 1 column 755 path $.data[1]
2018-11-04 11:55:52.376 25533-25533/us.sensornet.aviationweatherv2
D/CheckWXApiProxy: onMetarReportFailure: called:
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was
STRING at line 1 column 755 path $.data[1]
Caused BY: java.lang.IllegalStateException: Expected BEGIN_OBJECT
but was STRING at line 1 column 755 path $.data[1].
Для запроса с одной успешной станцией и одной ошибкой. Если вы посмотрите на предоставленные ответы, то увидите, что последние один или два объекта, возвращенные в массиве данных, являются сообщениями об ошибках строк, а не метеорологическим объектом. Моя проблема заключается в правильной обработке этих строк. Простое добавление ScalarConverterFactory не решило эту проблему.