在 postgresql 中创建嵌套 json

Create nested json in postgresql

我试图通过传递给 json_object() 两个数组来创建 JSON 对象。一个带有键,第二个带有 JSON(或 JSONB) 对象。以便将 JSON 作为预定义键的值。 json_object() 函数的签名是 json_object(varchar[], varchar[]) 但在我的例子中我有 json_object(varchar[], json[])。问题是当我进行类型转换时 json_object(varchar[], json[]::varchar[]) 字符串化为 json 元素创建转义字符串,而 postgress 不将值识别为嵌套 JSON,而是认为这是字符串值。

SELECT
   json_object(
                ARRAY[set_of_keys::varchar],
                ARRAY[set_of_values::json],
              ) as some_column

给出错误function json_object(varchar[], json[]) does not exist

SELECT
   json_object(
                ARRAY[set_of_keys::varchar],
                ARRAY[set_of_values::json]::varchar[],
              ) as some_column

导致 set_of_values.

的逃逸字符串化

如何在不进行字符串化的情况下将这些对象作为值?

示例数据:

SELECT
   json_object(
                ARRAY['a', 'b', 'c'],
                ARRAY['{"key1":"value1"}'::json, '{"key2": "value2"}'::json, '{"key3": "value3", "key4":"value4"}'::json]::varchar[]
              ) 

我想去掉第二个数组末尾的 ::varchar[] 类型转换。

The documentation of json_object 说:

All values are converted to JSON strings.

因此,如果您想要任意 JSON 值而不是字符串,请不要使用 json_object

而是使用 json_object_agg:

SELECT json_object_agg(key, value)
FROM UNNEST(array_of_keys, array_of_values) AS kv(key, value)

Online demo 用你的样本数据)