Postgres:json文字列をテキストに変換する方法は?


93

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

ありがとう。

PS私はPostgreSQL9.3を使用しています


stackoverflow.com/q/19414361/562459が役立つ場合があります。ではないかもしれない。
Mike Sherrill'Cat Recall '

文字列の配列に関する同様の問題、stackoverflow.com / q / 45243186/287948
Peter Krauss

回答:


58

PostgreSQLにはスカラーJSONオブジェクトを分解する方法はありません。したがって、あなたが指摘するように、

select  length(to_json('Some "text"'::TEXT) ::TEXT);

は15です

秘訣は、JSONを1つのJSON要素の配列に変換してから、を使用してその要素を抽出すること->>です。

select length( array_to_json(array[to_json('Some "text"'::TEXT)])->>0 );

11を返します。


8
json_extract_path_text()ルート要素(AFAIK)を参照できないのは残念です。
Erwin Brandstetter 2014

3
興味深いことに、関数from_jsonが提案されたが実装されなかった2012年のAPI設計段階で、ブレーンストーミングの議論があったようです。wiki.postgresql.org
wiki /

147

9.4.4では、#>>演算子の使用は私のために働きます:

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

テーブル列で使用するには:

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

2
Postgres9.4で最も簡単な解決策のようです。ただし、9.3では機能しません。
e79ene 2015

2
@hasen OPは、JSON値からテキストを抽出しようとしていると述べto_json(...)ています。これは、短い1行のステートメントの例として使用するJSON値を作成する簡単な方法です。確かに、説明したとおりにテーブルをクエリする場合は、JSON列の名前に置き換えます。また、潜在的な混乱のポイントを明確にするために(...)::text#>>演算子が定義によりテキストを返すため、キャストは冗長です(そして、そもそも演算子を使用する理由です)。かっこはそのままにして、キャストを削除することもでき::textます。
イアンティモシー

1
誰かが何#>>を綴って何をし'{}'ているのでしょうか?私はこれを完全にフォローすることはできず、どちらの用語もグーグルフレンドリーではありません。この答えは私の問題を解決しました、私はただ理由を知りたいです。
valadil 2016年

1
@valadilオペレーターのドキュメント#>>こちらです。
イアンティモシー

1
@valadilこの場合、トップレベルまたはルートのJSONオブジェクトがありますtext。文字列のように見えるかもしれませんが、JSONオブジェクトです。そのオブジェクトをJSONからテキストに変換するには、#>>演算子を使用します。ただし、その演算子ではパスを指定する必要があります。そのルートオブジェクトへのパスは{}です。つまりSELECT '"test"'::jsonb #>> '{}'、「ルートパスでオブジェクトを取得し、それをテキストに変換する」という意味です。
イアンティモシー

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)

0

これを行う簡単な方法:

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

json文字列をjsonリストに変換するだけです


0

->>私のために働きます。

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

指摘してくれてありがとう、私は上記のバージョンを修正しました
Surinder

元の質問は、JSON文字列の値を(オブジェクトキーなしの)テキストとして取得する方法です。この答えは、ちょうど間の差である->->>キーを使用して。この回答またはこの回答を参照してください。
イアンティモシー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.