【问题标题】:JsonDeserializer No Processing Null ValuesJsonDeserializer 不处理空值
【发布时间】:2020-06-04 13:39:40
【问题描述】:

我无法让 JsonDeserializer 处理空值。我有一个正在读取的 json 文件,其中我的记录类型只有四个值:案例 1、案例 2、* 或 null。 JsonDeserializer 对于前 3 个工作正常。但是,遇到空值时它似乎什么都不做。根据代码(请参阅下面的自定义反序列化器),我预计该行

text = StringUtils.upperCase(jsonParser.getText());

要么抛出异常(并因此分配 text = "NULL)。或者,按照每个返回一个空字符串

if (StringUtils.isBlank(text))

我同样指定 text = "NULL"。然而,这些都没有发生。似乎根本没有处理 null (这是不可能的,对吧?)。我的

System.out.println("TEXT: " + text);

总是打印案例 1、案例 2 或 *,但从不打印 NULL。从字面上看,它似乎跳过了文件中的空条目,或者至少不以我的代码中说明的任何方式处理它。 如有任何想法,我将不胜感激。谢谢!!

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import my.local.CustomValue;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;

public class CustomDeserializer extends JsonDeserializer<CustomValue> {
    @Override
    public CustomValue deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext)  {
       CustomValue retVal = null;

       // Get the text from the JSON
       String text = null;


       try {
          text = StringUtils.upperCase(jsonParser.getText());
       } catch (IOException e) {
          e.printStackTrace();
          text = "NULL";
       }

       System.out.println("TEXT: " + text);

       // If the text is empty or null, make it NULL
       if (StringUtils.isBlank(text)) {
          text = "NULL";
       }

       // Based on the text value, return the appropriate retVal
       switch (text) {
          case "Case 1":
              retVal = CustomValue.CASE1;
              break;

          case "Case 2":
              retVal = CustomValue.CASE2;
              break;

          case "NULL":
              retVal = CustomValue.NULL;
              break;

          case "*":
              retVal = CustomValue.WILDCARD;
              break;

          default:
              retVal = CustomValue.NULL;
              break;
        }

      return retVal;
    }
}

【问题讨论】:

标签: java jackson


【解决方案1】:

JsonDeserializer.deserialize 的 JavaDoc 声明如下:

"... 请注意,此方法永远不会为 JSON null 文字调用,因此反序列化程序需要(并且不应该)检查它。"

Jackson 自己处理null 值,不会调用自定义反序列化器的deserialize。要自定义为 null 返回的值,您必须重写反序列化器的 getNullValue 方法。

【讨论】:

  • 谢谢。我没有完全理解。我创建了以下内容:@Override public CustomValue getNullValue(DeserializationContext ctxt) throws JsonMappingException { return ColumnValue.NULL; } 。它仍然需要以某种方式调用我的反序列化,。它正在调用我的 getNullValue() (这很好)。但是仍然没有调用反序列化。我还没有完全理解……
  • 您尚未共享使用 JsonDeserializer 的代码。我假设您使用 ObjectMapper 进行反序列化,并注册了您的 JsonDeserializer 以对特定字段或类型进行反序列化。
  • 当现在使用 ObjectMapper 进行反序列化时,它会首先读取属性的值。如果它是一个 null 文字(即 null 而不是 'null'),它会调用注册的反序列化器的 getNullValue() 并使用返回的值进行反序列化。如果值不为 null,则调用 deserialize() 方法并使用此方法的返回值进行反序列化。因此,您可以完全忽略反序列化器方法中的空值。
  • Nvermind。我现在明白了。你的回答很到位。它现在正在工作。我在上面添加的内容:@Override public CustomValue getNullValue(DeserializationContext ctxt) throws JsonMappingException { return ColumnValue.NULL; } 是我所需要的,这是基于你的洞察力。谢谢
猜你喜欢
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
相关资源
最近更新 更多