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

e79*_*ene 76 postgresql json

Json值可以包含字符串值.例如.:

postgres=# SELECT to_json('Some "text"'::TEXT);
     to_json
-----------------
 "Some \"text\""
Run Code Online (Sandbox Code Playgroud)

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

::TEXT不起作用.它返回引用的json,而不是原始字符串:

postgres=# SELECT to_json('Some "text"'::TEXT)::TEXT;
     to_json
-----------------
 "Some \"text\""
Run Code Online (Sandbox Code Playgroud)

谢谢.

PS我正在使用PostgreSQL 9.3

Ian*_*thy 118

在9.4.4使用#>>运算符为我工作:

select to_json('test'::text) #>> '{}';
Run Code Online (Sandbox Code Playgroud)

要与表列一起使用:

select jsoncol #>> '{}' from mytable;
Run Code Online (Sandbox Code Playgroud)

  • @valadil 在这种情况下,有一个顶级或根 JSON 对象“text”。它可能看起来像一个字符串,但它是一个 JSON 对象。要将对象从 JSON 转换为文本,请使用“#>>”运算符。但该运算符需要您指定一个路径。该根对象的路径是“{}”。所以 `SELECT '"test"'::jsonb #>> '{}'` 的意思是“获取根路径的对象并将其转换为文本”。 (4认同)
  • 似乎是 Postgres 9.4 中最简单的解决方案。但是不适用于 9.3。 (3认同)
  • @hasen OP 表示他正在尝试从 JSON 值中提取文本,而 `to_json(...)` 只是一种创建 JSON 值的简单方法,以作为一个简短的单行语句的示例。如果您按照您的描述查询表,当然可以将其替换为 JSON 列的名称。此外,为了消除潜在的混淆点,您的强制转换 `(...)::text` 是多余的,因为 `#>>` 运算符根据定义返回文本(这也是首先使用运算符的原因)。您可以保留括号但删除强制转换`::text`。 (3认同)
  • @valadil “#>>”运算符的文档位于[此处](https://www.postgresql.org/docs/9.6/static/functions-json.html)。 (2认同)

小智 45

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

select  length(to_json('Some "text"'::TEXT) ::TEXT);
Run Code Online (Sandbox Code Playgroud)

是15岁,

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

select length( array_to_json(array[to_json('Some "text"'::TEXT)])->>0 );
Run Code Online (Sandbox Code Playgroud)

将返回11.

  • 遗憾的是`json_extract_path_text()`无法引用根元素(AFAIK). (7认同)
  • 有趣的是,有一个头脑风暴的讨论显然已经回到了2012年的API设计阶段,其中提出了一个函数`from_json`,但没有实现https://wiki.postgresql.org/wiki/JSON_API_Brainstorm (3认同)
  • 这已经过时了。请参阅其他答案,了解当前版本的 postgre 的更简单的解决方案。 (3认同)

cur*_*oul 11

->>对我有用。

postgres 版本:

<postgres.version>11.6</postgres.version>
Run Code Online (Sandbox Code Playgroud)

询问:

select object_details->'valuationDate' as asofJson, object_details->>'valuationDate' as asofText from MyJsonbTable;
Run Code Online (Sandbox Code Playgroud)

输出:

  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
Run Code Online (Sandbox Code Playgroud)

  • 最初的问题是如何获取 JSON 字符串的值作为文本(无对象键)。这个答案只是使用键时 `-&gt;` 和 `-&gt;&gt;` 之间的区别。请参阅[此答案](/sf/answers/2223006971/)或[此答案](/sf/answers/4112891681/)。 (3认同)

Mr.*_*ous 9

好奇先生对此也很好奇。除了#>> '{}'操作符之外,在 9.6+ 中可以使用操作符获取 jsonb 字符串的值->>

select to_jsonb('Some "text"'::TEXT)->>0;
  ?column?
-------------
 Some "text"
(1 row)
Run Code Online (Sandbox Code Playgroud)

如果有一个 json 值,那么解决方案是先转换成 jsonb:

select to_json('Some "text"'::TEXT)::jsonb->>0;
  ?column?
-------------
 Some "text"
(1 row)
Run Code Online (Sandbox Code Playgroud)