jsonB在Postgres(版本9.6)中将任何文本(或varchar)转换为键入的正确方法是什么?
例如,在这里我使用两种方法,我得到不同的结果:
方法1:
dev=# select '[{"field":15,"operator":0,"value":"1"},{"field":15,"operator":0,"value":"2"},55]'::jsonb;
jsonb
----------------------------------------------------------------------------------------------
[{"field": 15, "value": "1", "operator": 0}, {"field": 15, "value": "2", "operator": 0}, 55]
(1 row)
Run Code Online (Sandbox Code Playgroud)
方法2,它不会产生预期的结果,顺便说一句:
dev=# select to_jsonb('[{"field":15,"operator":0,"value":"1"},{"field":15,"operator":0,"value":"2"},55]'::text);
to_jsonb
----------------------------------------------------------------------------------------------------
"[{\"field\":15,\"operator\":0,\"value\":\"1\"},{\"field\":15,\"operator\":0,\"value\":\"2\"},55]"
(1 row)
dev=#
Run Code Online (Sandbox Code Playgroud)
在这里,它被转换为字符串,而不是数组.为什么第二种方法不能创建数组?
McN*_*ets 11
根据Postgres文档:
to_jsonb(anyelemnt)
以json或jsonb的形式返回值。数组和组合被(递归)转换为数组和对象。否则,如果存在从类型到json的强制转换,则将使用强制转换功能执行转换;否则,否则,产生标量值。对于除数字,布尔值或空值以外的任何标量类型,将使用文本表示形式,其方式为有效的json或jsonb值。
恕我直言,您提供的是JSON格式的字符串,那么您应该使用第一种方法。
to_json('Fred said "Hi."'::text) --> "Fred said \"Hi.\""
Run Code Online (Sandbox Code Playgroud)
如果尝试使用to_json(text)获取元素数组,则会得到下一个错误:
select *
from jsonb_array_elements_text(to_jsonb('[{"field":15,"operator":0,"value":"1"},{"field":15,"operator":0,"value":"2"},55]'::text));
Run Code Online (Sandbox Code Playgroud)
无法从标量中提取元素
但是,如果您以前将其转换为json:
select *
from jsonb_array_elements_text(to_jsonb('[{"field":15,"operator":0,"value":"1"},{"field":15,"operator":0,"value":"2"},55]'::json));
+--------------------------------------------+
| value |
+--------------------------------------------+
| {"field": 15, "value": "1", "operator": 0} |
+--------------------------------------------+
| {"field": 15, "value": "2", "operator": 0} |
+--------------------------------------------+
| 55 |
+--------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16473 次 |
| 最近记录: |