将包含对象数组的json传递给PostgreSQL函数会抛出格式错误的数组文字。意外的数组元素

时间:2018-05-08 15:57:47

标签: json postgresql function

我有一个简单的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}”
  • DETAIL:意外的数组元素。
  • CONTEXT:SQL语句中的PL / pgSQL函数foo(json)第8行
  • 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;

1 个答案:

答案 0 :(得分:0)

问题在于函数内部的语法。 解析对象数组并将其分配给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;

感谢eurotrashAbelisto