Модификация и ответ CheckWX.com - PullRequest
0 голосов
/ 04 ноября 2018

У меня проблема в том, что мне нужно проанализировать ответы нескольких типов объектов из 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 не решило эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...