【问题标题】:Flatten a JSON Object with a nested object to flattened fields将带有嵌套对象的 JSON 对象展平为展平字段
【发布时间】:2019-01-17 19:52:15
【问题描述】:

我正在使用 Android 的 Room 和 Jackson 将传入的 JSONObjects/JSONArrays 持久化为 POJO/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("address") 并分配字段。

【问题讨论】:

  • 你试过添加@Embedded(prefix = "address_") 吗?

标签: android serialization jackson android-room


【解决方案1】:

@embedded 是最简单的方法并且效果很好。

【讨论】:

    【解决方案2】:

    您可以通过实现地址设置方法来反序列化。

    myEntity类中添加这个setter方法:

    @JsonSetter
        public void setAddress(JsonNode text){
            this.addressNumber = text.get("number").asInt();
            this.addressStreet = text.get("street").asText();
            this.addressCity = text.get("City").asText();
        }
    

    【讨论】:

      【解决方案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);
      

      【讨论】:

      • 您没有用“公共地址;”回答问题。他不想要地址字段。
      猜你喜欢
      • 2021-10-19
      • 2012-05-29
      • 2020-03-02
      • 2018-10-24
      • 2017-07-02
      • 2020-12-22
      • 1970-01-01
      • 2020-06-23
      相关资源
      最近更新 更多