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


93

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\""

谢谢。

PS我正在使用PostgreSQL 9.3



字符串数组的类似问题,stackoverflow.com
Peter Krauss

Answers:


57

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。


8
遗憾的是json_extract_path_text()无法引用根元素(AFAIK)。
Erwin Brandstetter 2014年

3
有趣的是,显然是在2012年API设计阶段就进行了头脑风暴的讨论,其中from_json提出了一个功能,但并未实现。wiki.postgresql.org
wiki/

146

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

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

与表列一起使用:

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

2
似乎是Postgres 9.4中最简单的解决方案。但是不适用于9.3版。
e79ene 2015年

2
@hasen OP声明他正在尝试从JSON值中提取文本,并且这to_json(...)是创建JSON值的简单方法,可作为一个简短的单行语句的示例。当然,如果您要查询所描述的表,则可以将其替换为JSON列的名称。另外,为了消除潜在的混乱点,您的演员表(...)::text是多余的,因为#>>操作员会按定义返回文本(这是首先使用操作员的原因)。您可以保留括号,但可以删除演员表::text
伊恩·蒂莫西

1
可能有人拼什么#>>'{}'正在做什么?我不太明白这一点,也没有一个术语对Google友好。这个答案确实解决了我的问题,我只想知道为什么。
瓦拉迪尔16-10-11

1
@valadil#>>操作员的文档在这里
伊恩·蒂莫西

1
@valadil在这种情况下,存在一个顶层或根JSON对象text。它可能看起来像一个字符串,但它是一个JSON对象。要将对象从JSON转换为文本,请使用#>>运算符。但是该操作员需要您指定路径。该根对象的路径为{}。因此,SELECT '"test"'::jsonb #>> '{}'意味着“在根路径下获取对象并将其转换为文本”。
伊恩·蒂莫西

3

好奇先生对此也很好奇。除#>> '{}'运算符外,在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)

0

一种简单的方法:

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

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


0

->>对我有用。

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

感谢您指出,我更正了上述版本
Surinder

最初的问题是如何使用(无对象键)将JSON字符串的值获取为文本。这个答案只是使用键->->>使用键之间的区别。查看此答案此答案
伊恩·蒂莫西
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.