Aufheben der Anführungszeichen für JSON-Zeichenfolgen; JSON-Zeichenfolgen ohne Anführungszeichen drucken

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

gibt Ergebnis

| json_array_elements |
| : ------------------ |
| "eins" |
| "zwei" |

Ich hätte gerne das gleiche, aber ohne die Anführungszeichen:

one
two

Sieht so aus, als könnte ich ->>hier nicht verwenden , da ich keine Feldnamen im JSON habe. Es ist nur eine Reihe von Zeichenfolgen.

Postgres-Version: PostgreSQL 10.0 auf x86_64-apple-darwin, kompiliert von i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (basierend auf Apple Inc. Build 5658) (LLVM Build 2336.11.00), 64- bisschen

Maxim Yefremov
quelle
Welche Version von PostgreSQL?
Vérace
1
Diese Frage hat eine Antwort hier: dba.stackexchange.com/a/57121/110455
McNets
@ McNets - was ist damit ?
Vérace
@ Vérace auf db-fiddle zeigt Ergebnisse ohne Anführungszeichen, aber dbfiddle.uk zeigt Ergebnisse mit Anführungszeichen. Ich kann es auf meiner Postgres-VM nicht überprüfen (ich erinnere mich nicht an das Passwort), aber ich nehme an, es werden die Anführungszeichen angezeigt.
McNets
2
@ Vérace psql zeigt es auch mit Zitaten
McNets

Antworten:

10

Die Standard- Zwangsausgaben werden json->textmit einem doppelten Anführungszeichen ( ") ausgegeben, da Sie zum Erzwingen von textzu einer jsonZeichenfolge Ihre Eingabe in doppelte Anführungszeichen setzen müssen. Verwenden Sie, um die doppelten Anführungszeichen zu entfernenTRIM

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

Wichtig ist jedoch, dass Sie dadurch an Nutzen verlieren. Alle JSONB-Typen werden in einer Textform zurückgegeben, jsonbmit der Sie mit dem text->jsonbZwang zurückkehren können. Es ist eine bijektive Mapping-Funktion. Das zu verlieren bedeutet nullund "null"ist dasselbe wie 1und "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)

Interna ..

Wenn Sie wissen möchten, was passiert. Alle Typen können ein bereitstellen, _outdas sie zu textoder _sendzu einer binären Darstellung und einem Kehrwert führt _inund _recvdas sie von diesen Formularen und Zuordnungen zurück zu den Typen führt. Hier bekommen Sie jsonb_out,

  1. jsonb_outwas anruftJsonbToCstring
  2. JsonbToCstringwas anruftJsonbToCStringWorker
  3. JsonbToCStringWorkerwas anruftjsonb_put_escaped_value
  4. jsonb_put_escaped_value(StringInfo out, JsonbValue *scalarVal)was anruftescape_json
  5. escape_json(StringInfo buf, const char *str)das fügt" das hinzu und es ist fest codiert. Kein anderer Weg.
Evan Carroll
quelle
11
SELECT value#>>'{}' as col FROM json_array_elements('["one", "two"]'::json);

Ergebnis:

col
---
one
two
Slava V.
quelle
Als >>kleine Erklärung: Die enthaltenen Operatoren scheinen einen JSON im Allgemeinen in nicht entkoppelten Text zu konvertieren: postgresql.org/docs/current/functions-json.html . Diese Antwort ist wahrscheinlich vorzuziehen, da das Escapezeichen wahrscheinlich nicht auf das Hinzufügen von Anführungszeichen beschränkt ist, sondern auch Anführungszeichen im Text und einige Sonderzeichen. Die obigen Beispiele enthalten zufällig keine. ("Wahrscheinlich", weil ich es nicht getestet habe.)
Denis Drescher
Eher #>>ist das ein JSON-Operator, der ein Objekt an einem Pfad zurückgibt
jso