杰克逊:将原始消息的一部分保存到 jsonb

Posted

技术标签:

【中文标题】杰克逊:将原始消息的一部分保存到 jsonb【英文标题】:jackson: saving part of original message to jsonb 【发布时间】:2019-03-20 14:49:17 【问题描述】:

我收到一条 json 消息。我反序列化了大多数字段,但有一个字段我不必反序列化,但我必须保存到数据库中。它可以是任何 json 对象:


  "important_field": 123,
  "unimportant" : ...

所以我将它反序列化为

int important_field;
JsonObject unimportant;

现在我需要将它保存到 postgres。 unimportant 字段映射为 jsonb。当然,当我尝试使用弹簧保存它时:

jdbcTemplate.batchUpdate("insert into my_table (default, ?,?)", list)

我明白了:

PSQLException:无法推断用于 com.fasterxml.jackson.databind.node.ObjectNode 实例的 SQL 类型。使用带有显式 Types 值的 setObject() 来指定要使用的类型。

如何保存?我必须手动序列化unimportant 字段吗?或者也许有更好的方法来反序列化更容易保存的消息?

【问题讨论】:

我不了解 Spring,但我们正在使用 Hibernate 做类似的事情,基本上有两种方法:1)提供一个自定义用户类型,告诉 Hibernate 如何序列化 JsonObject(我们是主要使用这个)和2)手动执行并将json作为字符串传递(可能需要在查询中进行一些转换)(我们基本上只将它用于本机查询) - Spring可能提供类似的东西。 【参考方案1】:

是的,您必须先将其序列化为字符串,然后使用显式类型转换/转换:

jdbcTemplate.batchUpdate("insert into my_table (default, ?, ?::jsonb)", list)

由于 JSON 无论如何都是一种文本格式,因此如果驱动程序会为您执行此操作,则不会带来性能优势。

【讨论】:

以上是关于杰克逊:将原始消息的一部分保存到 jsonb的主要内容,如果未能解决你的问题,请参考以下文章

Azure IoT Hub 十分钟入门系列 - 使用消息路由将原始设备数据记录存档

杰克逊:冲突的@JsonTypeInfo和@JsonSerialize(as = Klass.class)

如何将死信消息路由回原始主题?

如何将原始 html 添加到 Wordpress 表单中的成功消息中

构造多部分 MIME 消息而不将其保存在内存中

将消息属性从 lambda 添加回 SQS DLQ