【发布时间】:2017-06-08 13:40:40
【问题描述】:
在我的一个应用程序中,我有一个通用的 Volley Web 服务,我用它来从我们的服务器加载数据并反序列化它们,像这样唱 GSON:
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
T parsedJson = mGson.fromJson(json, mType);
return Response.success(parsedJson, HttpHeaderParser.parseCacheHeaders(response));
} catch (Exception e) {
return Response.error(new ParseError(e));
}
}
现在我要反序列化的一个对象有点特殊,因为它的 json 模型包含两个列表,但在代码中我需要一个字典,其中第一个列表对象的 id 是键和第二个列表对象的数组是值。
我还需要在反序列化后对这两个列表进行排序。 (我请求我们的后端开发人员进行排序并为我提供一个合适的 json 模型,但他们拒绝这样做,不要问我为什么......)。
无论如何,现在我需要一种方法来进行排序以及属性的计算。
在 iOS 中,我使用的是 SwiftyJson,这并不是您从 GSON 获得的真正的自动 JSON 反序列化,但我可以在后台线程中计算和排序必要的字段,在该线程中我“反序列化”对象。
但在 Android 上,我有这个通用函数,因此不知道我当前正在反序列化哪个对象,就我而言,GSON 使用默认构造函数并直接写入字段而不是使用 setter。
所以现在我被困住了。我想知道什么时候最好的情况是计算我的字段。我想到了这些方法:
- 添加一个临时布尔值来检查我是否已经对列表进行了排序。访问列表的 getter 时,第一次是假的,所以我知道我必须排序。我对列表进行排序,将排序后的列表存储回来,然后将其返回。对于计算出的字典,我只需要检查它是否为空,如果是,则计算它
- 使用单一方法实现某种
PostDeserializable接口。在通用 Web 服务中,我可以检查T parsedJson是否是该接口的实例,如果是,则调用其上的方法。
后者的优势在于它可以在后台运行,但我还必须记住该界面(这对于不了解它的新开发人员来说可能会有问题)。然而,第一个可能会产生影响,因为它很可能会在 UI 线程中运行。
我想知道 GSON 中是否有默认方式来执行某些后序列化方法,也许是通过注释?希望您能帮助我找到使用最少的自定义代码的最佳方法。
【问题讨论】:
-
这看起来与我认为我需要的完全一样。不幸的是,这不能通过 gradle 获得,所以我想我可以只使用我自己的界面,这样我就没有其他 gson-extras 的所有开销
-
是的,你是对的,这只是 gson-extras 并且不会作为工件在全球范围内发布。您可以借用该代码并对其进行修改以满足您的需求。
标签: android gson deserialization pojo