java - GSON 序列化多个属性到子对象

标签 java android gson retrofit

我一直在我的项目中尝试使用 Retrofit 和 GSON,遇到了一个不寻常的情况,我试图在 Android 上使用 GSON 将两个属性从 JSON 转换为一个子对象。

示例 JSON:

{
  "cat1_id": "1111",
  "cat1_name": "First Category",
  "cat2_id": "2222",
  "cat2_name": "Second Category",
}

根据典型示例,似乎通常会创建这样一个类。

public class InventoryItem {

     private int    cat1_id;
     private String cat1_name;
     private int    cat2_id;
     private String cat2_id;

}

但是,我宁愿做这样的事情。

public class InventoryItem {

    private Category category1;
    private Category category2;
}

public class Category {
    private int    id;
    private String name;
}

有没有办法用 GSON 来完成这个?我一直在考虑只创建一个 Retrofit 可以用作响应的 POJO,然后使用 for 循环将其转换为我更喜欢的格式。但这似乎违背了 GSON 的全部目的。

最佳答案

我建议两种方法。

让类(class)充当搭桥者

只需重新定义您的初始 InventoryItem 类,使其充当 InventoryItemBuilder 的构建器。

class InventoryItemBuilder {
    @SerializedName("cat1_id")   private int    catOneId;
    @SerializedName("cat1_name") private String catOneName;
    @SerializedName("cat2_id")   private int    catTwoId;
    @SerializedName("cat2_name") private String catTwoName;

    public InventoryItem buildInventoryItem() {
        Category c1 = new Category(catOneId, catOneName);
        Category c2 = new Category(catTwoId, catTwoName);
        return new InventoryItem(c1, c2);
    }
}

然后,在将 JSON 反序列化为 ItemHolder 实例后,您只需调用 buildInventoryItem() 方法:

//InventoryItem{category1=Category{id=1111, name='First Category'}, category2=Category{id=2222, name='Second Category'}}
InventoryItem inventoryItem = new Gson().fromJson(json, InventoryItemBuilder.class).buildInventoryItem();

实现自定义反序列化器

只需告诉解析器您想如何反序列化您描述的 JSON 实体:

class InventoryItemDeserializer implements JsonDeserializer<InventoryItem> {
    @Override
    public InventoryItem deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jObject = json.getAsJsonObject();
        Category c1 = new Category(jObject.get("cat1_id").getAsInt(), jObject.get("cat1_name").getAsString());
        Category c2 = new Category(jObject.get("cat2_id").getAsInt(), jObject.get("cat2_name").getAsString());
        return new InventoryItem(c1, c2);
    }
}

然后在解析器中注册它:

Gson gson = new GsonBuilder().registerTypeAdapter(InventoryItem.class, new InventoryItemDeserializer()).create();

并使用它:

InventoryItem inventoryItem = gson.fromJson(json, InventoryItem.class);

这会产生与之前相同的输出。当然,反序列化器可能不太具体(例如,通过遍历对象的条目集)。这应该会给您一些见解。

希望对您有所帮助! :)

关于java - GSON 序列化多个属性到子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33878790/

相关文章:

java - Java中使用Gson解析Json

java - 将集合映射到所有组合的列表中

java - 如何将mysql中的时间转换为时区特定时间

java - 如何使用 Java 反射创建具有接受接口(interface)的构造函数的实例?

java - eclipse:java已启动但​​已退出,代码=14

android - 为什么当我在 android 中检查互联网连接时,我得到了真正的值(value)?

java - 安卓。 GradientDrawable 设置GradientCenter

安卓 Youtube 认证登录 SDK

java - JsonReader 在数组末尾停止读取

javascript - 解析 JSON 数组出现错误