Gson序列化取决于字段值

时间:2014-06-06 21:08:44

标签: java android json serialization gson

我的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主体。

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

2 个答案:

答案 0 :(得分:3)

要遵循的步骤:

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

我已在此处的相同上下文中发布了示例代码:

答案 1 :(得分:3)

选项1)使用TypeAdapter,查看已接受的答案here

选项2)如果使用Jackson代替gson是可能的,您可以在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)注释,以防止序列化任何空字段或空字段。