2016-01-29 2 views
1

определение таблицы:Как я могу вставить в массив Postgresql JSON

chat_id serial primary key, last_update timestamp, messages JSON[] 

, и я хочу, чтобы вставить запись так:

insert into chats (messages) values ('{{"sender":"pablo","body":"they are on to us"}}'); 

с ошибкой:

ERROR: malformed array literal: "{{"sender":"pablo","body":"they are on to us"}}" LINE 1: insert into chats (messages) values ('{{"sender":"pablo","bo...

Я также пробовал этот подход:

insert into chats (messages) values (ARRAY('{"sender":"pablo","body":"they are on to us"}')); 

Обратите внимание, что обновление строки и вставка с помощью array_append работает нормально.

ответ

2

Я думаю, что это столкновение между нотации JSON, который начинается с { и короткие руки нотации массива в Postgres, где строковое представление массива также обозначается с помощью {.

следующие работы:

insert into chats 
    (messages) 
values 
    (array['{"sender":"pablo","body":"they are on to us"}']::json[]); 

Это позволяет избежать неоднозначности {{ с помощью явного конструктора массива.

Чтобы сделать массив массивом json, нужно либо передать строку в json, либо полученный массив на json[] (см. Пример выше). Кастинг весь массив делает его легче, если у вас есть более одного документа в формате JSON в этой строке:

insert into chats 
    (messages) 
values 
    (array['{"sender":"pablo","body":"they are on to us"}', 
      {"sender":"arthur"}']::json[]); 

в качестве альтернативы:

insert into chats 
    (messages) 
values 
    (array['{"sender":"pablo","body":"they are on to us"}'::json, 
      {"sender":"arthur"}'::json]); 
0

Это довольно усложняют, чтобы экранировать специальные символы. Я бы использовал вставку из select, чтобы сделать ее проще.

  1. Создать массив JSON.
  2. Преобразуйте его в набор переменных JSON.
  3. Преобразование набора в массив SQL.

Выберите часть ниже.

WITH bu AS (SELECT json_array_elements('[{"name":"obj1"},{"name":"obj2"},{"name":"obj3"},{"name":"obj4"}]'::json) AS bu) 
SELECT array_agg(bu) FROM bu; 
Смежные вопросы