将 json 个对象的数组转换为 json

Convert array of json objects into json

在 postgres 中 table 我有一些这种格式的 jsonb

[{"type": "pet", "animal": "cat"}, {"type": "farm", "animal": "cow","colour": "brown"}]

但是我想把它变成这种格式

{"cat": {"type": "pet", "animal": "cat"}, "cow" {"type": "farm", "animal": "cow", "colour": "brown"}

而且我无法弄清楚,也无法在互联网上找到任何拥有这种格式的 jsonb 的人。谁能解决这个问题?理想情况下,没有 "colour" 的 key/value 的数据集不会有 {"colour": null} 但根本不会有键 "colour"

我正在使用 postgres 9.6

这是一种通过取消嵌套 json 数组并将其重新聚合到一个对象中来工作的选项:

select x.new_js_col
from mytable t
cross join lateral (
    select jsonb_object_agg(obj ->> 'animal', to_jsonb(obj)) new_js_col
    from jsonb_array_elements(t.js_col) as x(obj)
) x(new_js_col)

这假设您在 table mytable.

中有一个名为 js_col 的 jsonb 列

Demo on DB Fiddle:

| new_js_col                                                                                             |
| :----------------------------------------------------------------------------------------------------- |
| {"cat": {"type": "pet", "animal": "cat"}, "cow": {"type": "farm", "animal": "cow", "colour": "brown"}} |