web-dev-qa-db-ja.com

JSON文字列の引用符を外します。引用符なしでJSON文字列を印刷する

SELECT json_array_elements('["one", "two"]'::json)

結果を出す

 | json_array_elements | 
 | :--------------- | 「1つ」| 
 | 「2つ」| 

私は同じですが引用符なしにしたいと思います:

one
two

使用できないようです---(->> ここには、JSONにフィールド名がないためです。それは単なる文字列の配列です。

Postgresバージョン:x86_64-Apple-darwin上のPostgreSQL 10.0、i686-Apple-darwin11-llvm-gcc-4.2(GCC)4.2.1によってコンパイル済み(Apple Inc. build 5658に基づく)( LLVMビルド2336.11.00)、64ビット

9
Maxim Yefremov

textからjson文字列に強制変換するには、入力を二重引用符で囲む必要があるため、デフォルトの_json->text_強制変換は二重引用符(_"_)で出力されます。二重引用符を取り除くには、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)
_

重要なポイントですが、それを行うと一部のユーティリティが失われます。すべてのJSONBタイプは、_text->jsonb_強制を使用して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)
_

内部..

何が起こっているのか知りたい場合。すべての型は、それらをtextに変換する__out_またはバイナリ表現に変換する__send_と、それらを取得する相互__in_および__recv_を提供できます。それらのフォームとマップをタイプに戻します。ここでは_jsonb_out_を取得しています。

  1. _jsonb_out_ which calls JsonbToCstring
  2. JsonbToCstring which calls JsonbToCStringWorker
  3. JsonbToCStringWorker which calls _jsonb_put_escaped_value_
  4. jsonb_put_escaped_value(StringInfo out, JsonbValue *scalarVal) which calls _escape_json_
  5. escape_json(StringInfo buf, const char *str) which _"_ を追加すると、ハードコードされます。 他に方法はありません。
7
Evan Carroll
SELECT value#>>'{}' as col FROM json_array_elements('["one", "two"]'::json);

結果:

col
---
one
two
9
Slava V