使用额外属性为Gson定义模型

时间:2016-03-16 19:30:50

标签: android json model gson

我正在为Gson序列化/反序列化定义模型,我正在尝试找出给定特定JSON响应的最佳方法。

我的应用中的每个API调用都采用类似的格式:

  • 状态:通话状态
  • message:如果上述状态为“错误”,则显示消息
  • 数据:用户要求的任何数据

在我的模型中,我真的只关心数据。例如,如果用户调用/ 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时查看该字段。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

两种方式:

  1. 明确地对所有字段使用@Expose注释,您可以选择是仅对每个字段进行序列化,只是反序列化还是两者都进行。请注意,这也需要设置GsonBuilder.excludeFieldsWithoutExposeAnnotation()https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/annotations/Expose.html

  2. 定义自定义排除策略:https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/ExclusionStrategy.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)

  3. 如果您的项目很小,使用@Expose注释绝对是最快的。它的背面只是它使代码混乱。