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. Это будет работать.