Retrofit + GSON возвращает NULL для RegExp

Я использую Retrofit 2.0 в своем приложении с GSON конвертером.

В моем JSON у меня есть 6 полей, 3 для int и String, и 3 из них состоят из RegExps (1 int для "id" и 5 String полей в классе модели).

String и int fiends были проанализированы очень хорошо, но в полях с RegExp GSON возвращает NULL.

Вот пример JSON:

[
   {
     "id": "22",
     "iso": "TTR",
     "name": "Lolo",
     "check": "^77",
     "full": "^77[0-9]{9}$",
     "default": "+77"
   },
   {
     "id": "23",
     "iso": "RTT",
     "name": "Polo",
     "check": "^7",
     "full": "^7[0-6,8,9][0-9]{9}$",
     "default": "+7"
   }
]

и код во фрагменте:

Retrofit retrofit = new Retrofit.Builder()
         .baseUrl(URL_API)
         .client(SSLSuppressClient.trustcert())
         .addConverterFactory(GsonConverterFactory.create())
         .build();
GetPhones getPhonesInfo = retrofit.create(GetPhones.class);
Call<ArrayList<GetPhones> call = getPhonesInfo.getPhones();
call.enqueue(new Callback<ArrayList<GetPhones>>() {
    @Override
    public void onResponse(Response<ArrayList<GetPhones>> response, Retrofit retrofit) {
        Toast.makeText(getActivity(), "Success!", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onFailure(Throwable t) {
        Toast.makeText(getActivity(), "Failure!", Toast.LENGTH_SHORT).show();
        Log.d("LOG", t.getMessage());
                }
    });

и модель класса:

public class GetPhones {
    int id;
    String iso;
    String name;
    String lop_check;
    String lop_full;
    String lop_default;
}

В чем дело?

2 ответа

Решение

Вы должны объявить поле String full в GetPhones или если вы хотите использовать другое имя для него, вы должны использовать аннотацию @SerializedName, Например

@SerializedName("default")
String lop_default;

в этом случае Gson будет использовать full в качестве ключа для разбора вашего JSON. В целом это относится к каждому полю, который вы хотите проанализировать. В противном случае вы всегда получите нулевое значение / значение по умолчанию

Он вернет ноль, потому что Retrofit не смог найти отображение для переменной phone_ftm_check.

Вам нужно добавить аннотацию @SerializedName("check") поверх объявления вашей переменной.

Итак, ваш класс POJO должен выглядеть следующим образом:

public class GetPhones {
    int id;
    String iso;
    String name;
    @SerializedName("check")
    String phone_ftm_check;
    @SerializedName("full")
    String phone_ftm_full;
    @SerializedName("default")
    String phone_ftm_default;
}

Попробуйте этот класс POJO. Это будет работать.

Другие вопросы по тегам