用杰克逊序列化空值

我正在尝试使用自定义序列化程序通过 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());


DIEA
浏览 121回答 1
1回答

牧羊人nacy

我建议简单地进行空检查,或者如您所言,通过异常处理。@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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java