杰克逊:将原始消息的一部分保存到 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)