web-dev-qa-db-fra.com

Unquoting JSON strings; imprimer des chaînes JSON sans guillemets

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

donne un résultat

 | json_array_elements | 
 | : --------------- | "un" | 
 | "deux" | 

Je voudrais avoir la même chose mais sans les guillemets:

one
two

On dirait que je ne peux pas utiliser --- (->> ici parce que je n'ai pas de noms de champs dans le JSON. C'est juste un tableau de chaînes.

Version Postgres: PostgreSQL 10.0 sur x86_64-Apple-darwin, compilé par i686-Apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Basé sur Apple Inc. build 5658) ( LLVM build 2336.11.00), 64 bits

9
Maxim Yefremov

La sortie par défaut de la contrainte json->text Avec un guillemet double (") Parce que la contrainte de text vers une chaîne json vous oblige à mettre entre guillemets votre entrée. Pour vous débarrasser des guillemets doubles, utilisez 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)

Point important cependant, vous perdez une utilité si vous le faites. Tous les types JSONB sont renvoyés sous une forme textuelle qui peut être utilisée pour revenir à jsonb avec la contrainte text->jsonb. C'est une fonction de cartographie bijective. Perdre cela signifie que null et "null" Sont les mêmes, tout comme 1 Et "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)

Internes ..

Si vous voulez savoir ce qui se passe. Tous les types peuvent fournir un _out Qui les amène à text ou _send Qui les amène à une représentation binaire et une réciproque _in Et _recv qui les reprend de ces formulaires et les mappe aux types. Ici, vous obtenez jsonb_out,

  1. jsonb_out qui appelle JsonbToCstring
  2. JsonbToCstring qui appelle JsonbToCStringWorker
  3. JsonbToCStringWorker qui appelle jsonb_put_escaped_value
  4. jsonb_put_escaped_value(StringInfo out, JsonbValue *scalarVal) qui appelle escape_json
  5. escape_json(StringInfo buf, const char *str) qui ajoute le " et il est codé en dur. Pas d'autre moyen.
7
Evan Carroll
SELECT value#>>'{}' as col FROM json_array_elements('["one", "two"]'::json);

Résultat:

col
---
one
two
9
Slava V