Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gson序列化取决于字段值_Java_Android_Json_Serialization_Gson - Fatal编程技术网

Java Gson序列化取决于字段值

Java Gson序列化取决于字段值,java,android,json,serialization,gson,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 valueThre

我的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不是一个选项)

因此,基本上,如果将任何字段设置为默认值,我需要从序列化中排除字段。例如,如果字段
valueOne
null
,则生成的json应为:

{
    "value2" : true,
    "value3" : 2
}
你知道如何让这成为一种无痛的努力吗?我不想手动构建json主体

任何帮助都会很好。感谢您的建议。

以下步骤:
  • 使用将JSON字符串转换为
    Map
  • 迭代映射并从映射中删除
    null
  • 使用从最终映射返回的JSON字符串
我已经在相同的上下文中发布了示例代码:

选项1)使用类型适配器,请参阅接受答案:

选项2)如果可以使用INSTEADGSON,则可以在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\u NULL)
@JsonInclude(Include.NON\u EMPTY)
注释来防止任何NULL或空字段被序列化

谢谢你的回答。不幸的是,Jackson不是一个选项(对于许多要重构的对象来说)。如果对象有10个甚至15个字段,则可以排除TypeAdapter。@SerjLotutovici“可以排除”是什么意思?解决方法是“可以排除”。我不认为有人会试图为一个包含15个字段的对象编写一个TypeAdapter,你很可能会犯错误。但是杰克逊的建议——我的下一个项目会考虑的。啊,是的,我同意你的意见,如果是这样的话。我会看看@Braj的第一个解决方案