Маппинг JSON c помощью GSON, часть модели не получает данные и все время Null
Есть ответ от api в формате json:
"status": "ok",
"devices": {
"538764": {
"id": "538764",
"name": "",
"class_name": "Water",
"device_sn": "7590054",
"modem_id": "73d0a6",
"device_time": null,
"config_time": "1554455381",
"timezone": "Europe/Moscow",
"registrators": {
"cold": {
"id": "4635497",
"name": "",
"channel_id": "160",
"unit_id": "m³",
"offset": "0.0000",
"modem_value": null,
"last_value": "0.0760",
"last_value_timestamp": "1615339629",
"billing_init_value": "0.0520",
"billing_init_timestamp": "1583826840"
}, etc
Используя GSON пытаюсь замаппить ответ по моделям Метод:
public Devices parseFullElementInfo(String response){
JsonObject object= JsonParser.parseString(response).getAsJsonObject();
return gson.fromJson(object, Devices.class);
}
Класс Devices содержит в себе HashMap<Long, Device>:
public class Devices {
@SerializedName("devices")
private HashMap<Long, Device> devicesMap;
// getters
Класс Device содержит в себе класс Registrators:
public class Device {
@SerializedName("id")
private long id;
@SerializedName("name")
private String name;
@SerializedName("class_name")
private String className;
@SerializedName("device_sn")
private long deviceSn;
@SerializedName("modem_id")
private String modemId;
@SerializedName("device_time")
private long deviceTime;
@SerializedName("config_time")
private long configTime;
@SerializedName("timezone")
private String timezone;
@SerializedName("registrators")
private Registrators registrators;
// getters
Класс Registrators - это HashMap<String, Registrator>
Класс Registrator:
public class Registrator {
@SerializedName("id")
private Long id;
@SerializedName("name")
private String name;
@SerializedName("channel_id")
private String channelId;
@SerializedName("unit_id")
private String unitId;
@SerializedName("offset")
private Double offset;
@SerializedName("modem_value")
private Double modemValue;
@SerializedName("last_value")
private Double lastValue;
@SerializedName("last_value_timestamp")
private Long lastValueTimestamp;
@SerializedName("billing_init_value")
private Double billingInitValue;
@SerializedName("billing_init_timestamp")
private Long billingInitTimestamp;
//getters
Проблем: При использовании метода классы Deivces и Device получают значение без проблем, но данные не маппятся в Registrators, он остается null. Данные registrators точно приходят в api ответе. Предполагаю, что модель Registrators неправильная, но ошибку найти не могу.
Ответы (1 шт):
По совету @woesss, объявил HashMap <String, Registrator> непосредственно в Device:
public class Device {
@SerializedName("id")
private long id;
@SerializedName("name")
private String name;
@SerializedName("class_name")
private String className;
@SerializedName("device_sn")
private long deviceSn;
@SerializedName("modem_id")
private String modemId;
@SerializedName("device_time")
private long deviceTime;
@SerializedName("config_time")
private long configTime;
@SerializedName("timezone")
private String timezone;
@SerializedName("registrators")
private HashMap<String, Registrator> registratorsMap;
После чего Gson начал маппить нормально, это оказалось решением проблемы.