如何将文本转换为jsonB

Nul*_*lik 10 postgresql

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)

  • 我找到了适合我的演员作品。例子。选择强制转换('[{"字段":15,"运算符":0,"值":"1"},{"字段":15,"运算符":0,"值":"2"},55 ]' 作为 jsonb); (2认同)

小智 8

如果您的文本只是一个 json 格式的文本,您可以像这样显式地将其转换为 json/jsonb:

选择 '{"a":"b"}'::jsonb