如何使用 JsonFormat 将 Jackson Json NULL 字符串反序列化为日期

2023-11-29

我已经看了很多,但到目前为止仍然无法得到答案,非常感谢任何帮助!

我有一个简单的String to Date字段映射并尝试将 JSON 字符串读取到 Java 对象。

@JsonInclude(value=Include.NON_EMPTY)
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd-MMM-yyyy", timezone="PST")
protected Date eolAnnounceDate;

但是,如果 JSON 字符串值为空,我会收到以下异常。 有人能告诉我如何解决这个问题吗?我尝试了一些选项,但它们都是用于序列化的。

ObjectMapper objectMapper = new ObjectMapper();   
objectMapper.setSerializationInclusion(Include.NON_NULL); 
objectMapper.setSerializationInclusion(Include.NON_EMPTY);

例外 :

java.lang.IllegalArgumentException:无法解析日期值“NULL”(格式:“dd-MMM-yyyy”):无法解析日期:“NULL” com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateBasedDeserializer._parseDate(DateDeserializers.java:180) com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:279) com.fasterxml.jackson.databind.deser.std.DateDeserializers$DateDeserializer.deserialize(DateDeserializers.java:260) com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:464) com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:98) com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:295) com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121) com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:230) com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:207) com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:23) com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:464) com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:98) com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:295) com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121) com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888) com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034) com.cisco.cre.dao.impl.ElasticsearchDAOImpl.getListByIdsFilter(ElasticsearchDAOImpl.java:94)

谢谢 - 阿图尔


您的问题不在于 JSON 中传递了 null 值。问题是 JSON 包含一个具有值的字符串"NULL".

因此,为了解决这个问题,有许多可用的方法。我认为以下两个适用于这种情况。

替代方案 1:修复 JSON

第一个替代方案是修复 JSON,使其不包含字符串值"NULL"并包含值null(未引用)或直接跳过它。

想象一下以下 POJO:

public class DatePojo {
    @JsonInclude(value= JsonInclude.Include.NON_EMPTY)
    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd-MMM-yyyy", timezone="PST")
    @JsonProperty("date")
    private Date date;
}

以下测试显示有效日期、空值和null价值观工作:

@Test
public void testJson() throws IOException {
    String jsonWithValidDate = "{\"date\":\"12-Jun-1982\"}";
    String jsonWithNoDate = "{}";
    String jsonWithNullDate = "{\"date\":null}";

    ObjectMapper mapper = new ObjectMapper();
    final DatePojo pojoWithValidDate = mapper.readValue(jsonWithValidDate, DatePojo.class);
    final DatePojo pojoWithNoDate = mapper.readValue(jsonWithNoDate, DatePojo.class);
    final DatePojo pojoWithNullDate = mapper.readValue(jsonWithNullDate, DatePojo.class);

    Assert.assertNotNull(pojoWithValidDate.date);
    Assert.assertNull(pojoWithNoDate.date);
    Assert.assertNull(pojoWithNullDate.date);
}

但是,如果您传递该值"NULL"测试失败,因为"NULL"无法解析为日期:

@Test(expected = JsonMappingException.class)
public void testInvalidJson() throws IOException {
    String jsonWithNullString = "{\"date\":\"NULL\"}";

    ObjectMapper mapper = new ObjectMapper();
    mapper.readValue(jsonWithNullString, DatePojo.class); // Throws the exception
    Assert.fail();
}

替代方案 2:提供您自己的转换器来处理"NULL"

如果无法修复 JSON(如替代方案 1 中所述),您可以提供自己的转换器。

像这样设置你的 pojo:

public class DatePojo {
    @JsonProperty("date")
    @JsonDeserialize(converter = MyDateConverter.class)
    private Date date;
}

并提供一个转换器,如下所示:

public class MyDateConverter extends StdConverter<String, Date> {
    @Override
    public Date convert(final String value) {
        if (value == null || value.equals("NULL")) {
            return null;
        }
        try {
            return new SimpleDateFormat("dd-MMM-yyyy").parse(value);
        } catch (ParseException e) {
            throw new IllegalStateException("Unable to parse date", e);
        }
    }
}

那么,你应该已经准备好了。以下测试通过:

@Test
public void testJson() throws IOException {
    String jsonWithValidDate = "{\"date\":\"12-Jun-1982\"}";
    String jsonWithNoDate = "{}";
    String jsonWithNullDate = "{\"date\":null}";
    String jsonWithNullString = "{\"date\":\"NULL\"}"; // "NULL"

    ObjectMapper mapper = new ObjectMapper();
    final DatePojo pojoWithValidDate = mapper.readValue(jsonWithValidDate, DatePojo.class);
    final DatePojo pojoWithNoDate = mapper.readValue(jsonWithNoDate, DatePojo.class);
    final DatePojo pojoWithNullDate = mapper.readValue(jsonWithNullDate, DatePojo.class);
    final DatePojo pojoWithNullStr = mapper.readValue(jsonWithNullString, DatePojo.class); // Works

    Assert.assertNotNull(pojoWithValidDate.date);
    Assert.assertNull(pojoWithNoDate.date);
    Assert.assertNull(pojoWithNullDate.date);
    Assert.assertNull(pojoWithNullStr.date); // Works
}

IMO,最好的方法是使用替代方案 1,只需更改 JSON。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 JsonFormat 将 Jackson Json NULL 字符串反序列化为日期 的相关文章

随机推荐

  • 用retrofit-gson解析JSON?

    我正在尝试使用 Retrofit 来解析 json 数据 但没有收到数据来帮助我解析数据 以下是我创建的构建器和界面 public class fetchdata private static UserFetchData userdataf
  • 在 CodeIgniter 中创建主模板

    我遇到了一个非常基本的问题 问题是我想要一个主模板 在其中我可以调用页眉 正文和页脚 我无法在标头中发送标题和 css 以及如何发送多个 css 文件 我正在做这样的事情 这是控制器中的代码 data title Login To WePO
  • 如何从左向右移动/滑动图像

    我想从左向右滑动或移动图像 例如 http rajeevkumarsingh wix com pramtechnology 读取移动的五边形框 Ok 我尝试了一下但没能做到 我使用的代码如下
  • 使用 RVM 安装后,Ruby 1.9.2 不断恢复到 1.8.7

    我安装了 Ruby 1 9 2 我用了rvm use 1 9 2然后当我输入时ruby v它说1 9 2 然后 当我退出终端并重新打开它时 它再次显示 1 8 7 我究竟做错了什么 您的默认 ruby 很可能未设置为 ruby 1 9 2
  • 如何进行货物保存分析?

    我怎样才能把货物运到save analysis 我知道我可以这样做rustc通过致电 rustc Zsave snalysis
  • Matlab,如何调整图形上的轴值(科学记数法-精度不够)[重复]

    这个问题在这里已经有答案了 可能的重复 抑制数字刻度中的指数格式 对于我的图中的每个刻度线 Matlab 将我的轴标记输出为 5 777 x10 6 是否有可能让 matlab 输出实际的十进制数字而不是科学记数法 以便刻度线实际上是不同的
  • 读取文本文件并显示在表 vbscript 中

    我有一个具有以下结构的文本文件 C Users abc Desktop New Folder sample txt AccountName gt AbcPos AccountName gt dblLayer queryAccount gt
  • 在更新插入时跳过空值

    我正在使用 pg promise 来处理我的 Postgres 查询 但在找到以下查询的解决方案时遇到了麻烦 我正在尝试创建一种方法来一次批量插入多行 这是我的代码 massUpsert orgId entities gt db tx t
  • 如何在不重新启动的情况下关闭DEP(数据执行保护)?

    我正在编写一个测试网页 它调用 DLL 文件中的函数 但是每次我使用IE或FF打开它之前我必须禁用DEP 数据执行保护 否则脚本无法执行 当前禁用 DEP 的方法需要重新启动 但我不想重新启动 基本上 我正在寻找一种无需重新启动即可关闭 D
  • Google Cardboard Unity 5 没有立体视觉

    我的 Cardboard 应用程序在设备上没有立体效果 但它在编辑器中有效 这就是它在编辑器中的样子 https i stack imgur com sN14x png 这是它在设备上的样子https i stack imgur com 7
  • Pod 在 Kubernetes 中启动但不工作

    创建了具有 3 个 Pod 的 Kubernetes 集群部署 并且全部运行良好 但是当尝试运行它们时无法做到这一点 尝试在描述部分中执行卷曲 Pod 的 Ip 内部 我可以看到此错误 MountVolume SetUp failed fo
  • 自动执行eclipse插件

    我尝试创建一个 Eclipse 插件 当 Eclipse 工作台关闭时 它会删除一些文件 我从Hello World command插件项目并添加了IWorkbenchListener就像本主题中提到的Eclipse 关闭钩子能够停止终止
  • django 对 MongoDB 的内置支持

    我正在尝试查找官方 django 是否支持任何 noSQL DBMS 尤其是 MongoDB 的信息 我找到了一个Django 1 3 的分支 the Django nonrel 官方 django 的一个分支 和其他一些不太可靠的项目 根
  • 填充xaml矩形倍数solidcolorbrush

    xaml中这种类型的填充矩形可以吗 我不想使用渐变来填充矩形 因为每个部分的图像使用不同的纯色画笔 Thanks 尝试这个
  • std::string 构造函数中的内存分配/堆损坏

    我在内存分配方面再次遇到了一些麻烦 但我不明白为什么 当我在调试模式下运行程序时 我收到以下错误消息 我尝试尽可能准确地翻译它 Windows 已触发 LogoColorDetector exe 中的断点 这可能是由堆损坏引起的 这表明 L
  • 代理验证失败错误

    我正在尝试通过 FTP 站点代理访问 FTP 服务器以绕过防火墙it sauronsoftware ftp4j FTPClient我知道我的用户名 密码是正确的 因为我可以使用 FileZilla 进行连接 我尝试使用Authenticat
  • 如何编写多线程函数来同时处理不同的任务?

    我想定义一个do in parallelpython 中的函数将接受带参数的函数 为每个函数创建一个线程并并行执行它们 该函数应该像这样工作 do in parallel sleep 3 sleep 8 sleep 3 然而我很难定义do
  • WPF 数字 UpDown 控件在哪里?

    进入第一个严肃的 WPF 项目 似乎有很多基本的控件都缺失了 具体来说 我正在寻找 Numeric UpDown 控件 我是否错过了乐队外的发行 真的不想写自己的控件 我不想使用 WindowsFormHost 并在其上放置 WinForm
  • “mvn clean install”与“mvn install”有何不同?

    有什么区别mvn clean install and mvn install clean是 Maven 中自己的构建生命周期阶段 可以将其视为操作或任务 mvn clean install告诉 Maven 做clean运行之前每个模块中的阶
  • 如何使用 JsonFormat 将 Jackson Json NULL 字符串反序列化为日期

    我已经看了很多 但到目前为止仍然无法得到答案 非常感谢任何帮助 我有一个简单的String to Date字段映射并尝试将 JSON 字符串读取到 Java 对象 JsonInclude value Include NON EMPTY Js