如何插入Postgresql JSON数组

时间:2016-01-29 10:07:01

标签: json postgresql

表定义是:

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

我要插入这样的记录:

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

有错误:

  

错误:格式错误的数组文字:“{{”sender“:”pablo“,”body“:”他们对我们说“}}”   第1行:插入聊天(消息)值('{{“sender”:“pablo”,“bo ...

我也试过这种方法:

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

请注意,更新行并使用array_append插入工作正常。

2 个答案:

答案 0 :(得分:5)

我认为这是以{开头的JSON表示法与Postgres中的短手数组表示法之间的冲突,其中数组的字符串表示形式表示为{{ 1}}。

以下作品:

{

这通过使用显式数组构造函数避免了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[]);

答案 1 :(得分:0)

逃避特殊字符非常复杂。我会使用insert from select来使它更​​容易。

  1. 创建JSON数组。
  2. 将其转换为JSON变量集。
  3. 将集转换为SQL数组。
  4. 下面的选择部分。

    WITH bu AS (SELECT json_array_elements('[{"name":"obj1"},{"name":"obj2"},{"name":"obj3"},{"name":"obj4"}]'::json) AS bu)
    SELECT array_agg(bu) FROM bu;