取消引用 JSON 字符串;打印不带引号的 JSON 字符串

Max*_*mov 16 postgresql json string-representation postgresql-10

SELECT json_array_elements('["one", "two"]'::json)
Run Code Online (Sandbox Code Playgroud)

给出结果

| json_array_elements |
| :------------------ |
| “一个” |
| “两个” |

我想要相同但没有引号:

one
two
Run Code Online (Sandbox Code Playgroud)

看起来我不能->>在这里使用,因为我在 JSON 中没有字段名称。它只是一个字符串数组。

Postgres 版本:PostgreSQL 10.0 on x86_64-apple-darwin,由 i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (基于 Apple Inc. build 5658) (LLVM build 2336.11.00) 编译,64-少量

小智 22

SELECT value#>>'{}' as col FROM json_array_elements('["one", "two"]'::json);
Run Code Online (Sandbox Code Playgroud)

结果:

col
---
one
two
Run Code Online (Sandbox Code Playgroud)

  • “如何在 postgres 中取消引用 JSON 字符串?” “哦,很简单,只需在后面添加 `#>>'{}'` 即可。应该很明显。” 投出你的一票吧,巫师! (6认同)
  • 作为一点解释:包含“>>”的运算符似乎通常将 ​​JSON 转换为未转义的文本:https://www.postgresql.org/docs/current/functions-json.html。这个答案可能更可取,因为转义可能不仅限于添加引号,还可以转义文本中的引号和一些特殊字符。上面的样本恰好不包含任何样本。(“可能”是因为我没有测试过。) (3认同)
  • 相反,`#>>` 是一个 JSON 运算符,用于返回路径中的对象,请参阅:https://www.postgresql.org/docs/10/functions-json.html (2认同)

Eva*_*oll 14

默认json->text强制输出带有双引号 ( "),因为从 强制text转换为json字符串需要您将输入用双引号引起来。要摆脱双引号,请使用TRIM

SELECT x, trim('"' FROM x::text)
FROM json_array_elements('["one", "two"]'::json) AS t(x);
   x   | btrim 
-------+-------
 "one" | one
 "two" | two
(2 rows)
Run Code Online (Sandbox Code Playgroud)

重要的一点是,如果你这样做,你会失去一些效用。所有JSONB类型获得可用于返回到一个文本形式返回jsonbtext->jsonb强制。这是一个双射映射函数。失去这意味着null"null"是一样的,就像1和 一样"1"

SELECT x, trim('"' FROM x::text)
FROM json_array_elements('[null, "null", 1, "1"]') AS t(x);
   x    | btrim 
--------+-------
 null   | null
 "null" | null
 1      | 1
 "1"    | 1
(4 rows)
Run Code Online (Sandbox Code Playgroud)

内部..

如果你想知道发生了什么。所有类型都可以提供一个_out将它们带入text_send将它们带入二进制表示和倒数_in以及_recv将它们从这些形式中提取出来并映射回类型的方法。在这里你得到jsonb_out

  1. jsonb_out其中调用JsonbToCstring
  2. JsonbToCstring其中调用JsonbToCStringWorker
  3. JsonbToCStringWorker其中调用jsonb_put_escaped_value
  4. jsonb_put_escaped_value(StringInfo out, JsonbValue *scalarVal)其中调用escape_json
  5. escape_json(StringInfo buf, const char *str)添加了"并且它是硬编码的。没有其它的方法。


小智 14

SELECT json_array_elements_text('["one", "two"]'::json)
Run Code Online (Sandbox Code Playgroud)

如果使用 jsonb 代替:

SELECT jsonb_array_elements_text('["one", "two"]'::jsonb)
Run Code Online (Sandbox Code Playgroud)