我建议两种方法。
让班级充当桥梁建设者
只需重新定义您的初始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);
这会产生与以前相同的输出。当然,反序列化器可能不太具体(例如通过迭代对象的条目集)。这应该会给你一些见解。
希望对您有所帮助! :)