Передача json-файла, содержащего массив объектов, в функцию PostgreSQL выдает некорректный литерал массива. Неожиданный элемент массива - PullRequest
0 голосов
/ 08 мая 2018

У меня есть простая функция 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;

1 Ответ

0 голосов
/ 09 мая 2018

Проблема была с синтаксисом внутри функции. Правильный синтаксис для разбора массива объектов и присвоения его 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 !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...