2017-01-29 4 views
2

テキスト(またはvarchar)をPostgres(バージョン9.6)のjsonBタイプに変換する適切な方法は何ですか?テキストをjsonBに変換するには

方法1:

dev=# select '[{"field":15,"operator":0,"value":"1"},{"field":15,"operator":0,"value":"2"},55]'::jsonb; 
              jsonb            
---------------------------------------------------------------------------------------------- 
[{"field": 15, "value": "1", "operator": 0}, {"field": 15, "value": "2", "operator": 0}, 55] 
(1 row) 

ところで、所望の結果を生成しない方法2:

ここで私は2つの方法を使用していると私は異なる結果を取得しています。例えば

dev=# select to_jsonb('[{"field":15,"operator":0,"value":"1"},{"field":15,"operator":0,"value":"2"},55]'::text); 
               to_jsonb            
---------------------------------------------------------------------------------------------------- 
"[{\"field\":15,\"operator\":0,\"value\":\"1\"},{\"field\":15,\"operator\":0,\"value\":\"2\"},55]" 
(1 row) 

dev=# 

ここでは、配列ではなく文字列に変換されました。 2番目のメソッドが配列を作成しないのはなぜですか? Postgres documentationによると

答えて

1

to_jsonb(anyelemnt)

Returns the value as json or jsonb. Arrays and composites are converted (recursively) to arrays and objects; otherwise, if there is a cast from the type to json, the cast function will be used to perform the conversion; otherwise, a scalar value is produced. For any scalar type other than a number, a Boolean, or a null value, the text representation will be used, in such a fashion that it is a valid json or jsonb value.

あなたはJSONフォーマットされた文字列を提供しているIMHO、その後、あなたが最初のメソッドを使用する必要があります。

to_json('Fred said "Hi."'::text) --> "Fred said \"Hi.\"" 

あなたは(テキスト)をto_jsonを使用して要素の配列を取得しようとすると、次のエラー取得します:

select * 
from jsonb_array_elements_text(to_jsonb('[{"field":15,"operator":0,"value":"1"},{"field":15,"operator":0,"value":"2"},55]'::text)); 

cannot extract elements from a scalar

をしかし、あなたは以前にJSONにキャスト場合:

select * 
from jsonb_array_elements_text(to_jsonb('[{"field":15,"operator":0,"value":"1"},{"field":15,"operator":0,"value":"2"},55]'::json)); 

+--------------------------------------------+ 
|     value     | 
+--------------------------------------------+ 
| {"field": 15, "value": "1", "operator": 0} | 
+--------------------------------------------+ 
| {"field": 15, "value": "2", "operator": 0} | 
+--------------------------------------------+ 
| 55           | 
+--------------------------------------------+ 
+0

さて、あなたは 'json'についてではなく、' jsonb'について話しています。また、あなたの例で(フレッドはこんにちは)私は間違った結果を得る。そして、私は "データ型が組み込まれていない場合"の部分を理解していません、 ':: text'と' text'を組み込んでいます。私の入力を ':: text'に変換するもの、または' :: text'を構文解析して 'json'オブジェクトを生成するものです。 Postgresのドキュメントはうまくいっていません。 – Nulik

+0

はい、申し訳ありませんが、私は9.3バージョンのドキュメントを見ましたが、実際は結果は同じです。 – McNets

+0

'json'文字列に何が含まれているのかわからないので、配列にキャストできません。連想配列を使用する場合はどうなりますか? 9.6バージョンでは、私のクエリは異なる結果を生み出しています。だから私は、 'to_jsonb()'関数を使って正しく解析された 'jsonb'オブジェクトを受け取ると思っていたので、これは当てはまりません。 – Nulik

関連する問題