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 实现中的一个缺陷。在只有一列且该列的类型为 JSON
或 JSONB
的特殊情况下,列名可能并不重要,因此其内容应展平到描述该行的对象中.我为此创建了一个功能请求:https://github.com/jOOQ/jOOQ/issues/10953。它将在 jOOQ 3.15.0 和 3.14.4 中可用。您将能够做到这一点:
result.formatJSON(JSONFormat().header(false).wrapSingleColumnRecords(false));
RecordFormat
与此处无关。 RecordFormat.ARRAY
和 RecordFormat.OBJECT
的工作方式相同
直接使用 SQL
当然,您始终可以通过将所有逻辑移至 SQL 来解决此问题。您可能通过省略 JOIN
和 GROUP 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
,而不是空集 []
。
我有以下(简化的)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 实现中的一个缺陷。在只有一列且该列的类型为 JSON
或 JSONB
的特殊情况下,列名可能并不重要,因此其内容应展平到描述该行的对象中.我为此创建了一个功能请求:https://github.com/jOOQ/jOOQ/issues/10953。它将在 jOOQ 3.15.0 和 3.14.4 中可用。您将能够做到这一点:
result.formatJSON(JSONFormat().header(false).wrapSingleColumnRecords(false));
RecordFormat
与此处无关。 RecordFormat.ARRAY
和 RecordFormat.OBJECT
直接使用 SQL
当然,您始终可以通过将所有逻辑移至 SQL 来解决此问题。您可能通过省略 JOIN
和 GROUP 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
,而不是空集 []
。