当前位置: 首页 > 知识库问答 >
问题:

Gson序列化取决于字段值

姚星河
2023-03-14

我的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主体中,以便调用服务器。有些字段对于请求是可选的,如果我甚至用默认值和空值发送它,应用编程接口会做出不同的响应(不幸的是,更改应用编程接口不是一个选项)。

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

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

知道如何让这成为一种无痛的努力吗?我不想手动构建json主体。

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

共有2个答案

林星阑
2023-03-14

选项1)使用TypeAdapter,请参见此处接受的答案:

选项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或空字段被序列化。

姚才捷
2023-03-14

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

  • 使用Gson从JSON中删除空集合

 类似资料:
  • 是否有方法序列化类的瞬态字段?文档中提到默认情况下不支持它,但是否有办法打开它? 非常感谢

  • 主要内容:使用excludeFieldsWithModifiers()方法,使用@Expose注解默认情况下,GSON排除序列化/反序列化过程中的瞬态和静态字段。 我们来看看下面的例子。 示例 创建一个名为的Java类文件:GsonTester.java - 执行上面示例代码,得到以下结果 - 使用excludeFieldsWithModifiers()方法 GsonBuilder使用序列化/反序列化过程中的方法提供对使用特定修饰符排除字段的控制。 看下面的例子。 示例 创建一个名为的Java

  • 首先,我想说这是一个大学项目。 我有三节课<代码>订单抽象类和从订单继承的和类。 我使用Gson序列化/反序列化子类,但我遇到了一点问题。订单类有一个字段,gson使用该字段来确定订单类型,DineIn或Delivery。 序列化工作得很好。问题是,每当我尝试反序列化时,类型字段值都不会读取,并且总是设置为null,即使它存在于JSON文件中。当有很多字段时,就会发生这种情况,因为当我尝试在较小的

  • 我使用Gson与改造。我的服务器接受空值,所以在我给的gson构建器 这样就不会忽略空值。但是在一些s中,我有一个特殊的情况,其中一些字段应该存在,即使是它的null,而其他一些字段如果是null也不应该序列化。 例如,如果我有一个请求类,比如 如果我有一个请求,其中和,应该将其序列化如下: 这意味着,如果type为null,它应该忽略该字段,但是如果id为null,它应该在请求中显示为null。

  • 这里有人知道如何使用TypeAdapterFactory基于“type”字段进行反序列化而不需要将整个json流读取到JsonElement对象树中吗?

  • 问题内容: 我找不到在Gson进行序列化期间添加自定义字段的简单方法,我希望其他人可以提供帮助。 这是一个示例类来展示我的问题: 当我序列化类AI时,想返回以下内容: 其中url_to_user未存储在我的类A的实例中,但可以与数据一起在类A的实例中生成。 有没有简单的方法可以做到这一点?我宁愿避免只添加一个字段就编写整个序列化程序。 问题答案: 用得到,用它可以动态交互。