You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中如何将text[]数组转换为指定JSON格式(不使用array_to_json)

解决PostgreSQL中把成对text数组转成键值对JSON的问题

嘿,我懂你现在的困扰——array_to_json确实只能把数组原样转成JSON数组,没法帮你把成对的元素重新组合成键值对格式的JSON。不过别担心,PostgreSQL有专门的函数和方法来搞定这个需求,下面给你几个实用的方案:

方案一:直接用json_object/jsonb_object函数(最简便)

如果你的数组严格是偶数个元素,且正好是键、值依次排列,那json_object(对应JSON类型)或者jsonb_object(对应JSONB类型)就是最直接的解决方案,它们会自动把数组里的元素两两配对成键值对:

-- 转成JSON类型
SELECT json_object(text_text) AS key_value_json
FROM test.tt;

-- 转成JSONB类型(推荐,性能更好)
SELECT jsonb_object(text_text) AS key_value_jsonb
FROM test.tt;

执行后你会得到:
{"111": "4", "101803": "5"}

注意点:

  • 这个方法要求数组元素个数必须是偶数,否则会报错。
  • 生成的JSON里键和值都是字符串类型,如果需要把值转成数字,可以看下面的进阶方案。

方案二:灵活处理类型转换(把值转成数字)

如果希望把值转换成数字类型(比如4和5变成数字而不是字符串),可以用jsonb_object_agg结合数组下标来实现:

SELECT
    jsonb_object_agg(
        arr_element.key,
        -- 判断值是否为数字,是则转成numeric类型,否则保留字符串
        CASE 
            WHEN arr_element.value ~ '^[0-9]+$' THEN arr_element.value::numeric 
            ELSE arr_element.value 
        END
    ) AS result_jsonb
FROM (
    SELECT
        text_text[i] AS key,
        text_text[i+1] AS value
    FROM test.tt,
         -- 生成数组的下标索引
         generate_subscripts(text_text, 1) AS i
    -- 只取奇数下标(作为键的位置)
    WHERE i % 2 = 1
) AS arr_element
GROUP BY arr_element.key;

这个方案的好处是可以灵活处理值的类型,同时也能应对一些特殊情况(比如数组里偶尔有非数字值的场景)。

验证一下你的测试数据

先执行你的创建表和插入语句:

create table test.tt (text_text text[]); 
insert into test.tt values('{111,4,101803,5}');

然后用方案一的查询,就能得到你想要的{"111": "4", "101803": "5"}格式的JSON啦~

内容的提问来源于stack exchange,提问作者qian xiansheng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:54:56