将包含对象数组的 json 传递给 PostgreSQL 函数会引发格式错误的数组文字。意外的数组元素
Posted
技术标签:
【中文标题】将包含对象数组的 json 传递给 PostgreSQL 函数会引发格式错误的数组文字。意外的数组元素【英文标题】:Passing json containing array of objects to PostgreSQL function throws malformed array literal. Unexpected array element 【发布时间】:2018-05-08 15:57:47 【问题描述】:我有一个简单的 PostgreSQL 函数,我想将复杂的 JSON 传递给:
CREATE OR REPLACE FUNCTION foo(sync_data json)
RETURNS json AS
$body$
DECLARE
...
END;
$body$ LANGUAGE plpgsql;
这样调用它:
SELECT foo('"deviceId": 1, "shops": ["id": 1, "id": 2]'::json);
给我以下错误:
错误:格式错误的数组字面量:““id”:1” 详细信息:意外的数组元素。 上下文:PL/pgSQL 函数 foo(json) 第 8 行的 SQL 语句 SQL 状态:22P02我需要将复杂的 JSON 作为参数传递,其中包含对象数组。
谢谢!
PS:这是完整的功能文本:
CREATE OR REPLACE FUNCTION foo(sync_data json)
RETURNS json AS
$body$
DECLARE
res_json json;
device_id integer;
shops json ARRAY;
BEGIN
SELECT json_extract_path(sync_data, 'deviceId') INTO device_id;
SELECT json_array_elements(json_extract_path(sync_data, 'shops')) INTO shops;
SELECT json_build_object('devId', device_id) INTO res_json;
RETURN res_json;
END;
$body$ LANGUAGE plpgsql;
【问题讨论】:
嗨,其实没关系。错误在于函数调用语法。无论如何... 是的,我现在明白了,我的错;) 我想从“shops”元素中提取一个json对象数组json_array_elements
返回一组 json 对象。所以一个 json 数组是错误的类型来保存这些数据。您可以将其更改为仅json
,但您只能从json_array_elements
获得第一个结果。
shops := array(SELECT json_array_elements(sync_data->'shops'));
PS:你可以用select <expression> into <variable>;
代替<variable> := <expression>;
【参考方案1】:
问题在于函数内部的语法。 解析对象数组并将其分配给 json ARRAY 的正确语法:
CREATE OR REPLACE FUNCTION foo(sync_data json)
RETURNS json AS
$body$
DECLARE
res_json json;
device_id integer;
shops json ARRAY;
BEGIN
SELECT json_extract_path(sync_data, 'deviceId') INTO device_id;
shops := ARRAY(SELECT json_array_elements(sync_data->'shops'));
SELECT json_build_object('Dev_id', device_id, 'shop1', shops[1], 'shop2', shops[2]) INTO res_json;
RETURN res_json;
END;
$body$ LANGUAGE plpgsql;
感谢eurotrash 和Abelisto!
【讨论】:
以上是关于将包含对象数组的 json 传递给 PostgreSQL 函数会引发格式错误的数组文字。意外的数组元素的主要内容,如果未能解决你的问题,请参考以下文章