我是一个有用的助手,可以翻译文本。
使用POJO Schema生成器会创建不必要的类,使得代码维护变得困难。
这将会创建以下内容:
我已经简化了一下,因为这只是为了表达想法。在我的使用中,我当然将这些类重命名,使它们更易于管理。但我认为有一种方法可以简单地跳过Thing和Thing_,让我返回实际模型数据的列表(Thing__),并且可以删除其中两个类,“Thing__”可以简称为“Thing”。
我是对的。 Gson允许自定义反序列化,让我实现了这个目标。我快速地编写了一个Deserializer并使用了一个适当的TypeToken。
这可能是因为我的调用方式不正确:
我已经使用Retrofit 2和一些POJO对象有一段时间了。这是一个很棒的库,功能非常好,但它要求我写一些可怕的、混乱的模型,我想摆脱它们。
让我给你看看……我有以下JSON:
{
"things": [
{
"thing": {
"id": 823,
"created_at": "2016-02-09T22:55:07.153Z",
"published_at": "2016-02-10T19:23:42.666Z",
"downloads": 16073,
"size": 10716291
}
},
],
"count": 4,
"links": {}
}
使用POJO Schema生成器会创建不必要的类,使得代码维护变得困难。
这将会创建以下内容:
Things.java
@SerializedName("things")
@Expose
public List<Things_> things = new ArrayList<>();
Things_.java
@SerializedName("thing")
@Expose
private Thing__ thing;
Things__.java
// Insert normal variables and getter/setters here
我已经简化了一下,因为这只是为了表达想法。在我的使用中,我当然将这些类重命名,使它们更易于管理。但我认为有一种方法可以简单地跳过Thing和Thing_,让我返回实际模型数据的列表(Thing__),并且可以删除其中两个类,“Thing__”可以简称为“Thing”。
我是对的。 Gson允许自定义反序列化,让我实现了这个目标。我快速地编写了一个Deserializer并使用了一个适当的TypeToken。
Gson gson = new GsonBuilder()
.registerTypeAdapter(new TypeToken<ArrayList<Thing>>(){}.getType(), new AddonDeserializer())
.create();
List<Thing> model = gson.fromJson(jsonString, new TypeToken<ArrayList<Thing>>(){}.getType());
果然,传递上面的Json确实给了我一个可用的物品列表。
引入Retrofit 2!在我的Retrofit 2实例中添加registerTypeAdapter()(通过我的gson实例),现在我得到了一个错误消息:
Expected BEGIN_ARRAY but was BEGIN_OBJECT
这可能是因为我的调用方式不正确:
@Get("end/of/url/here/{slug}.json")
Call<List<Thing>> getThings(@Path("slug") String slug);
我的 Json 以一个对象 ("things") 开始,其中包含一个 "thing" 对象的数组。我的反序列化程序对此没有任何问题:
public class ThingDeserializer implements JsonDeserializer<List<Thing>> {
@Override
public List<Thing> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonArray array = json.getAsJsonObject().getAsJsonArray("things");
ArrayList<Thing> list = new ArrayList<>();
for (JsonElement anArray : array) {
list.add((Thing) context.deserialize(anArray.getAsJsonObject().get("thing").getAsJsonObject(), Thing.class));
}
return list;
}
}
无论如何,感谢您阅读完这个很长的问题!
我需要做些什么不同的事情或者如何操作Retrofit才能像我编写的Gson Deserializer一样工作?我现在的方法可以运行,但是为了学习新东西并编写更好维护的代码,我想想找出更好的方法。我可以使用ResponseBody回调和通过我的Deserializer将Json传递,但肯定有更好的方法。