Исключение для модифицированного конвертера Android

Как отформатировать/спроектировать свой класс, если вы можете получить 2 разных запроса ответа от сервера?

Примечание. Дооснащение вызовет исключение, если формат ответа JSON (дизайн) отличается от вашего класса. Все поля из ответа JSON должны присутствовать в вашем классе.

Класс Java, например ответ JSON:

public class RequestResponseLogin
{
   public ResponseLogin status;

   public class ResponseLogin
   {
      public boolean success;
      public List<String> message;
   }
}

Ответ JSON:

{
    "status" : {
                    "success" : false
                    "message" : {
                                    "Invalid credientials",
                                    "....",
                                    "...."
                                }
                }
}

Вот как я запрашиваю ответ:

interface iLogin
{
   @GET
   RequestResponseLogin loginUser(@Query("user") String user, @Query("pass") String pass);
}

// ....
RequestResponseLogin response = data.loginUser("admin", "abc123");

Если вход не удался, то public List<String> message; будет заполнен сообщениями с веб-сервера:

message[0] = 'Invalid credentials';
message[1] = 'Invalid username';
message[2] = 'Password match correct';

Но если веб-сервер ничего не отвечает (успешный вход в систему), то я получаю исключение путем модификации, потому что public List<String> message; пуст, веб-сервер ответил простым пустым строковым сообщением, а не массивом строк. Это сработает, если я изменю public List<String> message; на public String message;, но я не могу, потому что, если вход не удастся, это должен быть массив строк.


person Zbarcea Christian    schedule 12.10.2013    source источник


Ответы (1)


Это не имеет ничего общего с модернизацией. Gson по умолчанию используется для десериализации ответов JSON.

Поскольку ваш сервер отправляет обратно несовместимую структуру JSON, вам следует использовать пользовательский TypeAdapter для экземпляра Gson, чтобы справиться с этим.

После создания вашего экземпляра Gson (в данном примере это "gson") вы можете передать его в Retrofit следующим образом:

RestAdapter ra = new RestAdapter.Builder()
    // ... normal stuff ...
    .setConverter(new GsonConverter(gson))
    .build();
person Jake Wharton    schedule 15.10.2013