Я использую Android Room и Jackson для сохранения входящих JSONObjects / JSONArrays как POJOs / Entities.
С одной конечной точки я получаю ответ в такой форме:
{
"id": 1,
"name": "name"
"dob": 12421414,
"address": {
"number": 11,
"street":"some street",
"City": "A city"
}
}
Я хочу десериализовать "адресный" вложенный объект JSON в POJO как простой одномерный объект / сущность, как показано:
@Entity
public class myEntity{
@PrimaryKey
@NotNull
private int id;
private String name;
private int dob;
//Address flattened:
private int addressNumber;
private String addressStreet;
private String addressCity;
//Getters and setters
}
Как я могу это сделать? Это как если бы я хотел вызвать метод для получения @JsonProperty («адрес») и присвоения полей.
Используйте для этого библиотеку Gson, она легко решает вашу задачу.
1. Сначала добавьте зависимость для этого в свой файл build.gradle -
implementation 'com.google.code.gson:gson:2.8.5'
Создайте класс из json для вашего случая, класс будет:
public class MyEntity{
@SerializedName("id")
@Expose
public int id;
@SerializedName("name")
@Expose
public String name;
@SerializedName("dob")
@Expose
public int dob;
@SerializedName("address")
@Expose
public Address address;
}
3.Настройка Pojo:
Gson gson = new Gson();
MyEntity entity= gson.fromJson(br, MyEntity.class);
4. Все готово, теперь доступ к pojo -
Log.d("Data",entity.name);
Вы не отвечаете на вопрос с помощью "публичный адрес;". Он не хочет адресного поля.
Вы можете десериализовать, реализовав метод установки адреса.
Добавьте этот метод установки в класс myEntity:
@JsonSetter
public void setAddress(JsonNode text){
this.addressNumber = text.get("number").asInt();
this.addressStreet = text.get("street").asText();
this.addressCity = text.get("City").asText();
}
@embedded был самым простым методом и хорошо работал.
Вы пробовали добавить @Embedded (prefix = "address_")?