我正在使用scala / play框架构建调查应用程序,并使用postgres9.4和anorm。我在其他地方使用jsonb作为数据类型但在一个位置我想使用jsonb []认为这个类型是jsonb值的数组。我的json结构如下:
> z3 <- cbind(c(10,10,10,10));
> z3
[,1]
[1,] 10
[2,] 10
[3,] 10
[4,] 10
> m2
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4,] 10 11 12
> m2[,2]
[1] 2 5 8 11
> m3
[,1] [,2] [,3] [,4]
[1,] 10 10 10 8
[2,] 1 1 1 1
> m3 %*% m2[,2];
[,1]
[1,] 238
[2,] 26
> m3 %*% z3;
[,1]
[1,] 380
[2,] 40
>
这里每个兴趣都是json结构。我已经能够使用[
{"guitar":{"passion":3,
"expertise":5,
"willingToTeach":false,
"lookingForOthers":false
}
},
{"soccer":{"passion":3,
"expertise":3,
"willingToTeach":true,
"lookingForOthers":true
}
}
]
作为数据类型将json响应值添加到pgsql中的其他列,但是当我尝试使用jsonb
时,我得到了投诉:jsonb[]
在pgadmin3中,它实际上显示了我的确切数据类型:[PSQLException: Unknown type jsonb[].]
,用于我要插入的列。在我的anorm插入代码中,我尝试设置类型:
jsonb[]
但后来我收到了这个错误:
val pgObject = new PGobject();
pgObject.setType("jsonb")
我试过看了这个,但我甚至无法找到我可以用作pgObject.setType()的参数的所有字符串值。我也不确定除了使用setType()方法设置类型之外,我将如何将表达式从[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]
转换为jsonb
。
非常感谢任何帮助。
答案 0 :(得分:1)
许多框架不支持SQL数组。有一个数组的SQL标准,但大多数客户端都有部分支持或根本没有支持。
在PostgreSQL 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[...]
构造函数表示法,并注意包含'string literals'
对象的json
在数组中。
这是一个jsonb
字段,包含一个对象数组:
test=> SELECT
'
[
{ "x": 1, "y": 2 },
{ "a": 3, "b": 4 }
]
' :: jsonb;
jsonb
--------------------------------------
[{"x": 1, "y": 2}, {"a": 3, "b": 4}]
(1 row)
请注意,它是一个包含对象数组的json序列化的单个字符串文字。