jOOQ JSON 格式化为 objects 的数组

jOOQ JSON formatting as array of objects

我有以下(简化的)jOOQ 查询:

val result = context.select(
  jsonObject(
    key("id").value(ITEM.ID),
    key("title").value(ITEM.NAAM),
    key("resources").value(
      jsonArrayAgg(ITEM_INHOUD.RESOURCE_ID).absentOnNull()
    )
  )
).from(ITEM).fetch()

现在我想要的输出是:

[
    {
        "id": "0da04cc5-f70c-4fb3-b5c7-dc645d342631",
        "title": "Title1",
        "resources": [
            "8b0f6d5c-67fc-47ca-be77-d1735e7721ce",
            "ea0316db-1cfd-46d7-8260-5c1a4e65a0cd"
        ]
    },
    {
        "id": "0f7e67e6-5187-47e2-9f1d-dab08feba38b",
        "title": "Title2"
    }
]

result.formtJSON() 给出以下输出:

{
    "fields": [
        {
            "name": "json_object",
            "type": "JSON"
        }
    ],
    "records": [
        [
            {
                "id": "0da04cc5-f70c-4fb3-b5c7-dc645d342631",
                "title": "Title 1"
            }
        ]
    ]
}

result.formatJSON(JSONFormat.DEFAULT_FOR_RECORDS) 禁用 headers 会得到我:

[
    [
        {
            "id": "0da04cc5-f70c-4fb3-b5c7-dc645d342631",
            "title": "Title1",
            "resources": [
                "8b0f6d5c-67fc-47ca-be77-d1735e7721ce",
                "ea0316db-1cfd-46d7-8260-5c1a4e65a0cd"
            ]
        }
    ],
    [
        {
            "id": "0f7e67e6-5187-47e2-9f1d-dab08feba38b",
            "title": "Title2"
        }
    ]
]

我不想要额外的数组。

使用 result.formatJSON(JSONFormat().header(false).recordFormat(JSONFormat.RecordFormat.OBJECT)) 进一步自定义 JSONformatter 我得到:

[
    {
        "json_object": {
            "id": "0da04cc5-f70c-4fb3-b5c7-dc645d342631",
            "title": "Title1",
            "resources": [
                "8b0f6d5c-67fc-47ca-be77-d1735e7721ce",
                "ea0316db-1cfd-46d7-8260-5c1a4e65a0cd"
            ]
        }
    },
    {
        "json_object": {
            "id": "0f7e67e6-5187-47e2-9f1d-dab08feba38b",
            "title": "Title2"
        }
    }
]

我不希望 object 包含在 json_object 中。

有没有办法得到我想要的输出?

Result.formatJSON()

这显然是 Result.formatJSON() 的 jOOQ 3.14.0 实现中的一个缺陷。在只有一列且该列的类型为 JSONJSONB 的特殊情况下,列名可能并不重要,因此其内容应展平到描述该行的对象中.我为此创建了一个功能请求:https://github.com/jOOQ/jOOQ/issues/10953。它将在 jOOQ 3.15.0 和 3.14.4 中可用。您将能够做到这一点:

result.formatJSON(JSONFormat().header(false).wrapSingleColumnRecords(false));

RecordFormat与此处无关。 RecordFormat.ARRAYRecordFormat.OBJECT

的工作方式相同

直接使用 SQL

当然,您始终可以通过将所有逻辑移至 SQL 来解决此问题。您可能通过省略 JOINGROUP BY 来简化查询。我假设这等同于您想要的:

JSON result = context.select(
  jsonArrayAgg(jsonObject(
    key("id").value(ITEM.ID),
    key("title").value(ITEM.NAAM),
    key("resources").value(
      select(jsonArrayAgg(ITEM_INHOUD.RESOURCE_ID).absentOnNull())
      .from(ITEM_INHOUD)
      .where(ITEM_INHOUD.ITEM_ID.eq(ITEM.ID))
    )
  ))
).from(ITEM).fetchSingle().value1()

请注意,JSON_ARRAYAGG() 将空集聚合到 NULL,而不是空集 []