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

Gson TypeAdapter不适用于带有注释JsonAdapter的null

芮立果
2023-03-14

我已经编写了整型适配器,并用作注释来实现以下输出,但在gson库中编写的代码完全不允许使用注释配置进行空处理。

如果我取消注释1,2,4行和注释3行,那么我仍然没有实现我的愿望输出。

当我调试第189行的库代码(给定的屏幕截图)时,没有到达我的自定义适配器代码,因此空处理无法使用注释。有没有其他方法可以根据注释配置实现所需的输出?

期望输出:

  1. 猫科动物 - "" (用作注释并具有空值)
  2. phone-89(如所用注释,并具有整数值)
  3. 秩-(没有键存在,因为没有使用注释,并且具有空值)
@AllArgsConstructor
@Getter
@Setter
class CatDetails {
    private String name;
    private String breed;
    private String email;
    //@JsonAdapter(EmptyIfNullIntegerTypeAdapter.class) //1
    private Integer catlives;
    //@JsonAdapter(EmptyIfNullIntegerTypeAdapter.class) //2
    private Integer phone;
    private String city;
    private Integer rank;
    private Boolean likesMice;
}


public class EmptyIfNullIntegerTypeAdapter extends TypeAdapter<Integer> {

    @Override
    public void write(JsonWriter out, Integer value) throws IOException {
        if (value == null) {
            out.value("");
            return;
        }
        out.value(value);
    }

    @Override
    public Integer read(JsonReader in) throws IOException {
        if (in.peek() == JsonToken.NULL) {
            in.nextNull();
            return 0;
        }
        return in.nextInt();
    }

}


public class MyApp {
    public static void main(String... args) {
        CatDetails user = new CatDetails("cat007", "YUI", "abc.cat@gmail.com", null,89, "new",null, true);
        Gson gson = new GsonBuilder().setPrettyPrinting().registerTypeAdapter(Integer.class, new EmptyIfNullIntegerTypeAdapter()).create(); //3
        //Gson gson = new GsonBuilder().setPrettyPrinting().create(); //4
        String json = gson.toJson(user);
        System.out.println(json);
    }

}


Currently code giving below Output:
{
  "name": "cat007",
  "breed": "YUI",
  "email": "abc.cat@gmail.com",
  "catlives": "",
  "phone": 89,
  "city": "new",
  "rank": "",
  "likesMice": true
}

查看以下带有注释的输出:

特别注意两个整数字段(猫命)

{
  "name": "cat007",
  "breed": "YUI",
  "email": "abc.cat@gmail.com",
  "catlives": "",
  "phone": 89,
  "city": "new",
  "likesMice": true
}

共有1个答案

储俊英
2023-03-14

您需要将@JsonAdapter#nullSafe设置为false,否则默认情况下,Gson会使指定的适配器为空安全。例如:

@JsonAdapter(value = EmptyIfNullIntegerTypeAdapter.class, nullSafe = false)
private Integer catlives;
 类似资料:
  • 我是Spring的新手,我很困惑@CreatedDate注释在实体中是如何工作的。 我做了一次谷歌搜索,有很多解决方案,但除了一个,没有一个适合我。我很困惑为什么? 这是我先试的 它不起作用。我为列中的值获取了NULL。 然后我做了这个。 这实际上将时间戳存储在db中。我的问题是,我遵循的大多数教程都建议我不需要来获取当前时间戳。看起来我确实需要它。我缺少什么吗?

  • 错误在此输入图像描述 我试图发送事件的通知,当一些喜欢和评论他的帖子,通知评论和喜欢在这里工作是我的通知类。 我的控制器功能代码,用于通知评论 我的请求

  • 我试图让RunWith(PowerMockRunner.class)处理我现有的包注释。 版本: Powermock 1.4.12 mockito 1.9.0 jUnit 4.8.2 package-info.java//这是包注释 测试说明。java//这是包“com.smin.dummy”的元数据注释类 A、 爪哇 莫卡。Java语言 在unitest MockA中。如果我不使用RunWith

  • 环境:科特林 1.5.30, 春靴 2.5.4(Spring 5.3.9) 我试图创建一个组合注释来简化类似的模板注释代码。注释类如下: 预期用法: application.yaml: 但在应用程序启动后,TheBean 未按预期注册。 > 首先,我在github spring存储库中搜索,发现了这个:回归:自定义组合@Profile注释,组件扫描不再支持没有运行时保留。所以我试图但没有效果。 尝

  • 问题内容: 我的主要课程是 控制器 JSP页面 为什么对象字段未通过AddressForm验证? 请帮忙。 问题答案: 您需要用注解装饰的成员。请参阅《JSR 303:Bean验证》的 3.1.3和3.5.1节。正如我在对问题“ 是否存在使用注释方法启用JSR 303 Bean验证的标准方法”的 回答中所解释的那样,这是根据JSR 303 真正使用注释的方式。 编辑 示例代码:Hibernate

  • Spring参考文档说明如下: ComponentScanPackageMarker类故意省略了@Configuration注释。我已经测试了组件扫描和自动连接功能。令我吃惊的是,一切都很顺利: 组件扫描的这种行为是故意的吗?为什么即使没有@Configuration注释也能工作?