JOOQ:如何将 POJO 列序列化为 JSON

问题描述 投票:0回答:1

我正在尝试使用 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 吗?

mysql json jooq
1个回答
2
投票

这是一个有趣的功能想法,jOOQ 中的

DefaultRecordUnmapper
实现尚不支持。我为此创建了功能请求:

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

目前,Jackson 只能用于在

读取
数据库时将
JSON
JSONB 映射到您自己的数据结构。 写入数据库时则不然。但没有任何理由不应该提供逆逻辑。

与此同时,您必须实现数据类型

Converter<JSON, List<Rule>>
(或
Binding
,如果您需要更多功能)并将其附加到生成的代码中,请参阅:

使用

Converter
的好处是,现在每当您读/写此列时都可以获得类型安全。或者,实现
RecordUnmapperProvider
以全局覆盖默认行为。

© www.soinside.com 2019 - 2024. All rights reserved.