JOOQ:如何将 POJO 列序列化为 JSON
JOOQ: How to serialize POJO column to JSON
我正在尝试使用 JOOQ 和 Jackson 将 JSON 列写入 MySQL,但我不确定为什么它没有序列化为 JSON 而是序列化为 toString表示。
这是我生成 JOOQ 定义的 table:
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 吗?
这是一个有趣的功能想法,jOOQ 中的 DefaultRecordUnmapper
实现尚不支持它。我为此创建了功能请求:
目前,当从 数据库中读取数据时,Jackson 只能用于将JSON
和JSONB
映射到您自己的数据结构。当写入 数据库时不是。但是没有任何理由不应该提供反逻辑。
与此同时,您必须实现数据类型 Converter<JSON, List<Rule>>
(或 Binding
,如果您需要更多功能)并将其附加到生成的代码中,请参阅:
使用 Converter
的好处是,无论何时 read/write 此列,您现在都可以获得类型安全。
我正在尝试使用 JOOQ 和 Jackson 将 JSON 列写入 MySQL,但我不确定为什么它没有序列化为 JSON 而是序列化为 toString表示。
这是我生成 JOOQ 定义的 table:
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 吗?
这是一个有趣的功能想法,jOOQ 中的 DefaultRecordUnmapper
实现尚不支持它。我为此创建了功能请求:
目前,当从 数据库中读取数据时,Jackson 只能用于将JSON
和JSONB
映射到您自己的数据结构。当写入 数据库时不是。但是没有任何理由不应该提供反逻辑。
与此同时,您必须实现数据类型 Converter<JSON, List<Rule>>
(或 Binding
,如果您需要更多功能)并将其附加到生成的代码中,请参阅:
使用 Converter
的好处是,无论何时 read/write 此列,您现在都可以获得类型安全。