Postgres:如何将json字符串转换为文本?

时间:2014-11-30 16:09:01

标签: json postgresql

Json值可能包含字符串值。例如:

postgres=# SELECT to_json('Some "text"'::TEXT);
     to_json
-----------------
 "Some \"text\""

如何将该字符串提取为postgres文本值?

::TEXT无效。它返回引用的json,而不是原始字符串:

postgres=# SELECT to_json('Some "text"'::TEXT)::TEXT;
     to_json
-----------------
 "Some \"text\""

感谢。

P.S。我正在使用PostgreSQL 9.3

6 个答案:

答案 0 :(得分:101)

在9.4.4中使用#>>运算符对我有用:

select to_json('test'::text) #>> '{}';

使用表格列:

select jsoncol #>> '{}' from mytable;

答案 1 :(得分:36)

PostgreSQL中没有办法解构标量JSON对象。因此,正如你所指出的那样,

select  length(to_json('Some "text"'::TEXT) ::TEXT);

是15,

诀窍是将JSON转换为一个JSON元素的数组,然后使用->>提取该元素。

select length( array_to_json(array[to_json('Some "text"'::TEXT)])->>0 );

将返回11。

答案 2 :(得分:1)

先生。好奇也对此感到好奇。除了#>> '{}'运算符之外,在9.6+版本中,还可以使用->>运算符获取jsonb字符串的值:

select to_jsonb('Some "text"'::TEXT)->>0;
  ?column?
-------------
 Some "text"
(1 row)

如果具有json值,则解决方案是先将其转换为jsonb:

select to_json('Some "text"'::TEXT)::jsonb->>0;
  ?column?
-------------
 Some "text"
(1 row)

答案 3 :(得分:1)

->>对我有用。

postgres版本:

<postgres.version>11.6</postgres.version>

查询:

select object_details->'valuationDate' as asofJson, object_details->>'valuationDate' as asofText from MyJsonbTable;

输出:

  asofJson       asofText
"2020-06-26"    2020-06-26
"2020-06-25"    2020-06-25
"2020-06-25"    2020-06-25
"2020-06-25"    2020-06-25

答案 4 :(得分:0)

一种简单的方法:

SELECT  ('[' || to_json('Some "text"'::TEXT) || ']')::json ->> 0;

只需将json字符串转换为json列表

即可

答案 5 :(得分:-2)

这个问题/解决方案产生了另一个问题...... PostgreSQL开发人员的清单:为什么需要将 JSON-string 转换为 SQL-text 引用?
哦,有一些dillema ......为什么不向用户询问他们喜欢什么?

在SQL中,转换 char(N)会生成没有引号的预期文本;在嵌入式语言或驱动程序中,转换SQL- text 会生成没有引号的预期字符串数据类型,而 string 会生成预期的SQL- 文本没有语录......这是普遍预期的行为......