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

JsonDeserializer不处理空值

上官砚文
2023-03-14

我无法让JsonDeserializer处理空值。我正在读取一个json文件,其中我的记录类型只有四个值:Case 1、Case 2、*或null。JsonDeserializer可以很好地处理前3个。但是,遇到null时它似乎什么也做不了。根据代码(请参阅下面我的自定义反序列化器),我希望该行

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

要么抛出一个异常(从而将text = "NULL "赋值)。或者,根据返回一个空字符串

if (StringUtils.isBlank(text))

同样,我在这里指定text =“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;
    }
}

共有1个答案

茅秦斩
2023-03-14

JsonDeserializer.deserialize的JavaDoc声明如下:

"...请注意,JSON null literal从不调用此方法,因此反序列化程序不需要(也不应该)检查它。

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

 类似资料:
  • 在运行中,模板中的 空白 处理在某种程度上来说是纠缠所有模板引擎的一个问题。 我们来看这个模板。我已经用颜色标记了模板中的组件: 文本, 插值, FTL 标签.。 使用 [BR] 来想象 换行。 <p>List of users:[BR] <#assign users = [{"name":"Joe", "hidden":false},[BR] {

  • 问题内容: 我有一个包含3列的表格:c1,c2和c3。我想编写一条select语句,以便如果c1和c2都为空,则显示c3,否则显示c1。 在上述情况下,编写select语句的最佳方法是什么? 问题答案: 使用案例 使用NVL2 或者 使用解码 易读性和易用性CASE胜出。

  • 以下代码正在为空的属性抛出NPE。class Person有属性:string:name,Integer:age,Integer:salary此处可以为空。我想创建一个工资列表。 在这里,我必须在结果列表中保留空值。null不能替换为0。

  • white-space属性用来设置文本内空白符(如空格、回车、tab字符等)的处理方式,可选值有 normal | pre | nowrap | pre-wrap | pre-line,默认值为 normal。该属性出自 CSS1,在 CSS 2.1中新增了属性值 pre-wrap 和 pre-line。不同取值的含义见表 3‑6: 表 3‑6 white-space属性的取值及含义 属性值 含义

  • 我使用的是Spring批处理4.3.2。.我正在写测试,发现了一些奇怪的东西,签出下面的代码。 对于相同的jobexecutions,我会得到不同的“getStepExecutions()”结果,这取决于我获取它们的方式。你知道为什么会这样吗?还是我做错了什么? 干杯T

  • 我是Apache POI的新手,我需要根据数据库的内容编写excel文件。但是,当DB中有一个空/空字段时,会为该特定字段抛出一个空指针异常。我一直在读关于缺失的小区政策,这是解决这个问题的最好方法吗?为了简洁,我省略了很多代码,但下面是关键部分。例如,如果DB中的actualAmountReturned为空,则抛出一个NPE。