如何将JSON数组解析为PostgreSQL数组类型?

how to parse json array into postgresql array type?

提问人:Roland 提问时间:6/9/2023 最后编辑:Roland 更新时间:6/10/2023 访问量:93

问:

数组在PostgreSQL中看起来非常简单,但是我在将JSON解析为数组列类型时遇到了问题。

Json 数据包含一个具有数组值的属性:

"problems": ["/problems/22", "/problems/31"],

该表有一个数组类型的列,如下所示:

CREATE TABLE X(
  problems TEXT[],
  ...
);

解析通常有效,例如:

t.items->>'problems'  --ok

返回:

["/problems/22", "/problems/31"]

然后我尝试了这个不起作用:

t.items->>'problems'::text[]  --error, malformed

然后我在 json 中将 [] 替换为 {} 以遵循 PostgreSQL 数组语法:

replace(replace(t.items->>'problems', '[', '{'), ']', '}')::text[]  --ok

虽然这是“可行的”,但我觉得这是一个笨拙的问题。无论如何,这是丑陋的,而且不是PostgreSQL其他优雅方式的风格。

如何正确将JSON解析为TEXT[]数组类型列?

数组 JSON PostgreSQL 解析

评论

1赞 Bergi 6/9/2023
什么?你是说吗?-->->>

答:

1赞 SelVazi 6/9/2023 #1

如果我理解正确,您需要通过 json 元素问题来填充列问题,如果这是您想要的,那么结合使用将 json 数组转换为文本值列表json_array_elements_textARRAYTEXT[]

update mytable t
set problems = (SELECT ARRAY(SELECT json_array_elements_text(t.items->'problems')))

在这里演示

select 
  (SELECT ARRAY(
     SELECT json_array_elements_text(t.items->'problems')
  ))::text[] problems
from (
  select '{"problems": ["/problems/22", "/problems/31"]}'::json items
) t

输出:

problems                   |
---------------------------+
{/problems/22,/problems/31}|

评论

1赞 Roland 6/10/2023
对不起,我在答案中添加了小提琴,但你的小提琴正是我想要的。通过稍微格式化它,我使文本布局更窄,以便在没有水平滚动条的情况下更易于阅读,也使我更容易理解
0赞 SelVazi 6/10/2023
很高兴听到并感谢您的编辑:)
2赞 Bergi 6/9/2023 #2

您可以使用 json_arrray_elements_text 迭代数组,然后将其聚合回数组:

SELECT array_agg(value)
FROM json_array_elements_text(
  ('{"problems": ["/problems/22", "/problems/31"]}'::json)->'problems'
);

如果 json 值来自关系,则可以在子查询中执行此操作。

但是,如果您的 JSON 对象包含的属性已经与目标表具有相同的形状,则有一种更简单的方法 - 请使用json_populate_recordX

SELECT *
FROM json_populate_record(NULL::X, '{"problems": ["/problems/22", "/problems/31"]}'::json);

(在线演示)

评论

0赞 Roland 6/10/2023
我觉得你的答案很有用,总有一天我会明白的,我发现这个json / sql问题很复杂。另一个答案我可以直接应用于我的项目,但你的答案当然也很有用。谢谢。