为了账号安全,请及时绑定邮箱和手机立即绑定

用杰克逊序列化空值

用杰克逊序列化空值

DIEA 2022-12-21 13:04:54
我正在尝试使用自定义序列化程序通过 jackson 序列化一些可以为空的字段。在线阅读似乎杰克逊应该写一个“空”字符串,如果我想要不同的输出,我应该从它的官方 github 中遵循这个例子问题是我得到了 NullPointerException 而不是“空”字符串。JsonGenerator.writeNumberField 和 JsonGenerator.writeStringField 都会发生这种情况。要写一个空字符串,我应该管理异常,还是我遗漏了什么?这是堆栈跟踪:com.fasterxml.jackson.databind.JsonMappingException: [no message for java.lang.NullPointerException]    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._wrapAsIOE(DefaultSerializerProvider.java:509) ~[jackson-databind-2.9.6.jar:2.9.6]    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:482) ~[jackson-databind-2.9.6.jar:2.9.6]    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) ~[jackson-databind-2.9.6.jar:2.9.6]    at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3905) ~[jackson-databind-2.9.6.jar:2.9.6]    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3219) ~[jackson-databind-2.9.6.jar:2.9.6]    at petmenu.restControllers.ProdottoController.thirdStageInput(ProdottoController.java:92) ~[main/:na]    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_202]    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_202]    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_202]    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_202]这是有趣的代码   @Override    public void serialize(      Prodotto prod, JsonGenerator jgen, SerializerProvider serializer) throws IOException {        jgen.writeStartObject();//      getPeso_netto returns an Integer, that in the example is null        jgen.writeNumberField("peso_netto", prod.getPeso_netto());
查看完整描述

1 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

我建议简单地进行空检查,或者如您所言,通过异常处理。


@Override

    public void serialize(

      Prodotto prod, JsonGenerator jgen, SerializerProvider serializer) throws IOException {

        jgen.writeStartObject();


//      getPeso_netto returns an Integer, that in the example is null

        if (prod.getPeso_netto() != null)

            jgen.writeNumberField("peso_netto", prod.getPeso_netto());

        else {

            jgen.writeNullField("peso_netto");     

        }


编辑说明

JsonGenerator.writeNumberField 方法具有以下方法主体:


public final void writeNumberField(String fieldName, int value) throws IOException {

    this.writeFieldName(fieldName);

    this.writeNumber(value);

}

如您所见,该方法需要一个 int,而不是 Integer。编译器试图将 Integer 自动装箱为 int。NPE 失败,因为 Integer 是空对象。因此,NPE 不是“由 jackson 库的代码”抛出的,而是在试图将自动装箱的空值作为 int 传递给 jackson 方法时从 JVM 抛出的。


您可以使用以下代码段测试此行为:


Integer x = null;

x = 1 + x; // will throw NPE


查看完整回答
反对 回复 2022-12-21
  • 1 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信