【问题标题】:Gson serialization depending on field valueGson 序列化取决于字段值
【发布时间】:2014-07-28 05:52:08
【问题描述】:

我有一个类似于以下的 POJO:

public class MyGsonPojo {

    @Expose
    @SerializedName("value1")
    private String valueOne;

    @Expose
    @SerializedName("value2")
    private boolean valueTwo;

    @Expose
    @SerializedName("value3")
    private int valueThree;

    // Getters and other stuff here
}

问题是这个对象必须被序列化成一个 json 体才能调用 到服务器。某些字段对于请求是可选的,如果我什至使用默认值和空值发送它,API 会做出不同的响应(不幸的是,更改 api 不是一种选择)。

所以基本上我需要从序列化中排除任何字段,如果它们中的任何一个设置为默认值。例如,如果字段 valueOnenull,则生成的 json 应该是:

{
    "value2" : true,
    "value3" : 2
}

知道如何轻松完成这项工作吗?我不想手动构建 json 主体。

任何帮助都会很棒。谢谢你的建议。

【问题讨论】:

    标签: java android json serialization gson


    【解决方案1】:

    要遵循的步骤:

    • 使用 Gson#fromJson() 将 JSON 字符串转换为 Map<String,Object>
    • 迭代映射并从映射中删除 null 条目
    • 使用 Gson#toJson() 从最终映射中返回 JSON 字符串。

    我已经在这里发布了相同上下文中的示例代码:

    【讨论】:

      【解决方案2】:

      选项 1) 使用 TypeAdapter,请参阅接受的答案 here

      选项 2) 如果使用 Jackson 代替 gson 是可能的,您可以在 getter 而不是字段上注释/序列化,并将您的逻辑用于返回 无论您需要什么来获取 getter 中的“默认值”。

      //won't get serialized because it's private 
      private String valueOne;
      ...
      @JsonSerialize
      String getValueOne(){
         if (valueOne == null) return "true"
         else...
      }
      

      您还可以在类的顶部使用单个 @JsonInclude(Include.NON_NULL)@JsonInclude(Include.NON_EMPTY) 注释来防止任何 null 或空字段被序列化。

      【讨论】:

      • 谢谢您的回答。不幸的是,杰克逊不是一个选择(对许多对象进行重构)。如果对象有 10 个甚至 15 个字段,则可以排除 TypeAdapter。
      • @SerjLotutovici “可以排除”是什么意思?
      • “可以排除”作为解决方案。我不认为有任何人会尝试为具有 15 个字段的对象编写 TypeAdapter - 很有可能你会犯错误。但是感谢 Jackson 的提示 - 将在我的下一个项目中考虑它。
      • 啊,是的,如果是这样的话,我会同意你的看法。我会看看@Braj 的第一个解决方案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多