我正在为Gson序列化/反序列化定义模型,我正在尝试找出给定特定JSON响应的最佳方法。
我的应用中的每个API调用都采用类似的格式:
在我的模型中,我真的只关心数据。例如,如果用户调用/ get_buddies,我只想获得所有好友的列表。但我也“关心”这个地位,对吧?如果由于某种原因状态为“错误”(用户未登录,或某事),我想告诉用户并且Toast消息(这是一个不好的例子,因为它永远不会发生)... < / p>
如何创建我的模型以便我可以读取状态和消息,但是如果我将此模型作为JSON打包到发送,我就不会打包它们。
我的研究首先想到的是有一个名为GetBuddiesCall的课程
public class GetBuddiesCall {
String status;
String message;
ArrayList<Buddy> buddies;
}
然后是一个Buddy课程
public class Buddy {
String username;
String firstName;
String lastName;
// etc.
}
然后,Gson将查看这两个模型,并能够相应地反序列化。然后,在尝试序列化时,我只使用Buddy模型作为状态,并且客户端不需要消息 - &gt;服务器通信。有比这更好的方法吗?我知道你可以使用像transient这样的修饰符,这样可以防止Gson在打包JSON时查看该字段。
感谢您的帮助!
答案 0 :(得分:1)
两种方式:
明确地对所有字段使用@Expose
注释,您可以选择是仅对每个字段进行序列化,只是反序列化还是两者都进行。请注意,这也需要设置GsonBuilder.excludeFieldsWithoutExposeAnnotation()
。
https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/annotations/Expose.html
在最简单的形式中,这样的实现可以硬编码字段以跳过;更先进但也更灵活的方法是定义您自己的自定义注释,并对每个字段的存在进行排除策略检查,例如:它可能类似于@ReadOnly
或@Exclude(read = true, write = false)
。
请注意,您可以单独设置每个序列化和反序列化的偏移策略:https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/GsonBuilder.html#addDeserializationExclusionStrategy(com.google.gson.ExclusionStrategy)
如果您的项目很小,使用@Expose
注释绝对是最快的。它的背面只是它使代码混乱。