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 实现尚不支持它。我为此创建了功能请求:

  • #13604DefaultRecordUnmapper
  • 中反思使用 Jackson 的可能性
  • #13605 在代码生成器中使用开箱即用的 Jackson 转换器的可能性

目前,当 数据库中读取数据时,Jackson 只能用于将JSONJSONB 映射到您自己的数据结构。当写入 数据库时不是。但是没有任何理由不应该提供反逻辑。

与此同时,您必须实现数据类型 Converter<JSON, List<Rule>>(或 Binding,如果您需要更多功能)并将其附加到生成的代码中,请参阅:

使用 Converter 的好处是,无论何时 read/write 此列,您现在都可以获得类型安全。