在PostgreSQL中,如何将json字符串解包到文本中?

Jam*_*Lim 3 postgresql

假设我有一个类型的值json,比方说y.例如,可以通过obj->'key'返回类型值的任何函数来获得这样的值json.

当转换为此值时,该值text包括引号, "y"代替y.在使用json类型是不可避免的情况下,这会产生问题,特别是当我们希望将值与文字字符串进行比较时,例如

select foo(x)='bar';
Run Code Online (Sandbox Code Playgroud)

API头脑风暴页面提示一个from_json将智能解开JSON字符串的函数,但我怀疑这是尚未提供.与此同时,如何在没有引号的情况下将JSON字符串转换为文本?

adj*_*nks 7

文本:

要将值提取为文本,请使用#>>

SELECT to_json('foo'::text) #>> '{}';

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

PostgreSQL 文档页面:https://www.postgresql.org/docs/11/functions-json.html

因此它专门解决了您的问题,但它不适用于任何其他类型,例如整数或浮点数。该#>运算符也不适用于其他类型。

数字:

由于JSON只有一种数字类型“number”,并且没有 int 或 float 的概念,因此没有明显的方法将 JSON 类型转换为“正确”的数字类型。最好了解 JSON 的架构,提取文本,然后转换为正确的类型:

SELECT (('{"a":2.01}'::json)->'a'#>>'{}')::float

然而,PostgreSQL 的“数字”类型确实支持“任意精度数字”(“小数点前最多 131072 位;小数点后最多 16383 位” 。JSON 还支持大数字的“e”表示法。

尝试这个来测试它们:

SELECT (('{"a":2e99999}'::json)->'a'#>>'{}')::numeric


Jam*_*Lim 6

->>操作正确解开引号.为了利用该运算符,我们将值包含在数组中,然后将其转换为json.

CREATE OR REPLACE FUNCTION json2text(IN from_json JSON)
RETURNS TEXT AS $$
BEGIN
  RETURN to_json(ARRAY[from_json])->>0;
END; $$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

为了完整起见,我们提供了一个CAST利用上述功能的方法.

CREATE CAST (json AS text) WITH json2text(json) AS ASSIGNMENT;
Run Code Online (Sandbox Code Playgroud)

  • 啊.肯定有更好的办法.虽然我记得这对9.3 json API是一个真正的烦恼. (3认同)