Сглаживание объекта JSON с помощью вложенного объекта в сглаженные поля

Я использую 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 («адрес») и присвоения полей.

Вы пробовали добавить @Embedded (prefix = "address_")?

Sonu Sanjeev 10.08.2018 11:27
0
1
595
3

Ответы 3

Используйте для этого библиотеку Gson, она легко решает вашу задачу.

1. Сначала добавьте зависимость для этого в свой файл build.gradle -

 implementation 'com.google.code.gson:gson:2.8.5'
  1. Создайте класс из 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);

Вы не отвечаете на вопрос с помощью "публичный адрес;". Он не хочет адресного поля.

Sébastien BATEZAT 27.11.2019 09:28

Вы можете десериализовать, реализовав метод установки адреса.

Добавьте этот метод установки в класс 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 был самым простым методом и хорошо работал.

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