我正在尝试使用 JOOQ 和 Jackson 将 JSON 列写入 MySQL,但我不确定为什么它没有序列化为 JSON,而是序列化为 toString 表示形式。
这是我生成 JOOQ 定义的表:
create table JsonPayload
(
name varchar(127) primary key,
rules JSON not null,
defaultValue tinyint(1) default 0 not null
);
这是我想要绑定我的模型的类。
data class RuleTest(val name: String, val test: Boolean)
data class Rule(val name: String, val test: Boolean, val rule: RuleTest)
data class JsonPayload(val name: String, val rules: List<Rule>, val defaultValue: Boolean)
插入代码:
dsl.insertInto(JSONPAYLOAD)
.set(dsl.newRecord(
JSONPAYLOAD,
JsonPayload(
"Test",
listOf(Rule("rule1", false, RuleTest("rule1", false)),
Rule("rule2", true, RuleTest("rule1", false))),
true
)
))
.execute()
它的序列化和反序列化效果很好,但是它没有将正确的 JSON 写入 MySQL:
mysql> select * from JsonPayload;
+------+-----------------------------------------------------------------------------------------------------------------------------------------------+--------------+
| name | rules | defaultValue |
+------+-----------------------------------------------------------------------------------------------------------------------------------------------+--------------+
| Test | ["Rule(name=rule1, test=false, rule=RuleTest(name=rule1, test=false))", "Rule(name=rule2, test=true, rule=RuleTest(name=rule1, test=false))"] | 1 |
+------+-----------------------------------------------------------------------------------------------------------------------------------------------+--------------+
这是我创建的演示项目,用于演示此行为https://github.com/v1ctor/jooq-json-demo
你能帮我理解如何将正确的 Json 写入 MySQL 吗?
DefaultRecordUnmapper
实现尚不支持。我为此创建了功能请求:
目前,Jackson 只能用于在
读取数据库时将
JSON
和 JSONB
映射到您自己的数据结构。 写入数据库时则不然。但没有任何理由不应该提供逆逻辑。
与此同时,您必须实现数据类型
Converter<JSON, List<Rule>>
(或 Binding
,如果您需要更多功能)并将其附加到生成的代码中,请参阅:
使用
Converter
的好处是,现在每当您读/写此列时都可以获得类型安全。或者,实现 RecordUnmapperProvider
以全局覆盖默认行为。