如何为 play-scala anorm pgsql 设置 jsonb[] 的类型

how to set type for jsonb[] for play-scala anorm pgsql

我正在 scala/play 框架中构建一个调查应用程序,并使用 postgres9.4 和 anorm。我在其他地方使用 jsonb 作为数据类型,但在一个位置我想使用 jsonb[] 认为这种类型是 jsonb 值的数组。我的 json 结构如下所示:

[
    {"guitar":{"passion":3,
               "expertise":5,
               "willingToTeach":false,
               "lookingForOthers":false
              }
     },
     {"soccer":{"passion":3,
                "expertise":3,
                "willingToTeach":true,
                "lookingForOthers":true
                }
     }
]

这里每个兴趣都是一个json结构。我已经能够使用 jsonb 作为数据类型将 json 响应值添加到 pgsql 中的其他列,但是当我尝试使用 jsonb[] 时,我收到投诉: [PSQLException: Unknown type jsonb[].] In pgadmin3 它从字面上显示了我的确切数据类型:jsonb[] 对于我要插入的列。在我的异常插入代码中,我尝试设置类型:

val pgObject = new PGobject();
pgObject.setType("jsonb")

但是我得到这个错误:

[PSQLException: ERROR: column "passions" is of type jsonb[] but expression is of type jsonb
  Hint: You will need to rewrite or cast the expression.
  Position: 43]

我已经尝试查找它,但我什至无法找到我可以用作 pgObject.setType() 参数的所有字符串值。除了使用 setType() 方法设置类型之外,我也不确定如何将表达式从 jsonb 转换为 jsonb[]

如有任何帮助,我们将不胜感激。

许多框架不支持 SQL 数组。数组有一个 SQL 标准,但大多数客户对其有部分支持或根本不支持。

在 Postgre 中SQL type[] 是一个 type 的数组。所以jsonb[]是一个jsonb的数组。您的客户端似乎不理解这一点 - 它要么不支持数组,要么在每个数据类型的基础上具有特殊数组支持。

幸运的是,您 不需要 jsonb 的 SQL 数组,因为 jsonb 存储 JSON JavaScript 序列化对象表示法。 JSON 定义对象和数组。因此,您可以在 jsonb 字段 中包含一个对象数组 。不需要 SQL 个数组。

这是一个包含 jsonb 个值的 SQL 数组,其中每个 jsonb 值都是一个对象(字典):

test=> SELECT ARRAY[
           '{ "x": 1, "y": 2 }',
           '{ "a": 3, "b": 4 }'
        ] :: jsonb[];
                        array                        
-----------------------------------------------------
 {"{ \"x\": 1, \"y\": 2 }","{ \"a\": 3, \"b\": 4 }"}
(1 row)

它的数据类型为jsonb[]。注意 PostgreSQL ARRAY[...] 构造函数符号的使用,并注意包含 json 对象的 'string literals'inside 数组.

这是一个 jsonb 字段,包含一个对象数组:

test=> SELECT 
'
        [
                { "x": 1, "y": 2 },
                { "a": 3, "b": 4 }
        ]
' :: jsonb;
                jsonb                 
--------------------------------------
 [{"x": 1, "y": 2}, {"a": 3, "b": 4}]
(1 row)

请注意,它是一个包含对象数组的 json 序列化的单个字符串文字。