【问题标题】:Postgres: How to convert a json string to text?Postgres:如何将 json 字符串转换为文本?
【发布时间】:2014-11-30 16:09:00
【问题描述】:

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

谢谢。

附:我正在使用 PostgreSQL 9.3

【问题讨论】:

标签: json postgresql


【解决方案1】:

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

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

与表格列一起使用:

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

【讨论】:

  • 似乎是 Postgres 9.4 中最简单的解决方案。但是不适用于 9.3。
  • @hasen OP 声明他正在尝试从 JSON 值中提取文本,而 to_json(...) 只是一种简单的方法来创建 JSON 值以作为简短的单行语句中的示例使用.如果您按照您的描述查询表,您当然可以将其替换为 JSON 列的名称。此外,为了消除潜在的混淆,您的演员(...)::text 是多余的,因为#>> 运算符按定义返回文本(这也是首先使用运算符的原因)。您可以保留括号,但删除演员表::text
  • 有人能说出#>>'{}' 在做什么吗?我不能完全遵循这一点,而且这两个术语都不是谷歌友好的。这个答案确实解决了我的问题,我只是想知道为什么。
  • @valadil #>> 运算符的文档是 here
  • @valadil 在这种情况下,有一个顶级或根 JSON 对象 text。它可能看起来像一个字符串,但它是一个 JSON 对象。要将该对象从 JSON 转换为文本,请使用 #>> 运算符。但是该操作员需要您指定路径。该根对象的路径是{}。所以SELECT '"test"'::jsonb #>> '{}'的意思是“获取根路径下的对象,并将其转换为文本”。
【解决方案2】:

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。

【讨论】:

  • 很遗憾json_extract_path_text() 不能引用根元素(AFAIK)。
  • 有趣的是,显然早在 2012 年的 API 设计阶段就有一次头脑风暴讨论,其中提出了一个函数 from_json,但没有实现 wiki.postgresql.org/wiki/JSON_API_Brainstorm
  • 这已经过时了。使用当前版本的 postgre,查看其他答案以获得更简单的解决方案。
【解决方案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)

【讨论】:

    【解决方案4】:

    ->> 对我有用。

    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
    

    【讨论】:

    • 感谢指出,我更正了上面的版本
    • 原始问题是如何将 JSON 字符串的值作为文本获取(无对象键)。这个答案只是使用密钥时-&gt;-&gt;&gt; 之间的区别。请参阅this answerthis answer
    【解决方案5】:

    一个简单的方法:

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-26
      • 1970-01-01
      • 2022-01-11
      • 2021-01-29
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多