将包含对象数组的 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 函数会引发格式错误的数组文字。意外的数组元素的主要内容,如果未能解决你的问题,请参考以下文章

将 json 传递给包含 json 数组的服务器

如何将对象类型的 json 数组传递给 MVC 控制器类

通过 JSON 对象将 Session 对象中的字节数组传递给 Web 服务(Asp.Net 2.0 asmx)

如何将 Json 数组作为统一字段传递给 WWWform

我可以将包含字典对象的数组传递给异步映射吗

如何将值的“数组”传递给我的存储过程?