Bei der Arbeit mit JSON und MySQL müssen Sie möglicherweise Zeichenfolgen mit Escapezeichen versehen, damit ihre Anführungszeichen die Interpretation des JSON-Dokuments nicht beeinträchtigen. In solchen Fällen können Sie JSON_QUOTE()
verwenden Funktion, um potenziell problematische Zeichenfolgen zu maskieren.
JSON_QUOTE()
wird verwendet, um ein gültiges JSON-String-Literal zu erzeugen, das in ein JSON-Dokument eingefügt werden kann. Sie möchten beispielsweise, dass ein Element in einem Array den Text null
enthält als Zeichenfolgenliteral, anstatt einen tatsächlichen Nullwert zu haben. Diese Funktion kann verwendet werden, um sicherzustellen, dass der Text als String-Literal und nicht als Nullwert hinzugefügt wird.
Rufen Sie dazu einfach die Funktion auf, während Sie den String übergeben.
Syntax
Die Syntax lautet wie folgt:
JSON_QUOTE(string)
Wobei string
ist die zu maskierende Zeichenfolge.
Beispiel 1 – Grundlegende Verwendung
Hier ist ein Beispiel zur Veranschaulichung.
Schauen wir uns zunächst an, was passiert, wenn wir JSON_ARRAY()
verwenden Funktion zum Erstellen eines Arrays.
SELECT JSON_ARRAY("Hot", "Warm", "Cold") AS 'Ergebnis';
Ergebnis:
+-------------------------+| Ergebnis |+--------------------+| ["Heiß", "Warm", "Kalt"] |+--------------------+
Das Ergebnis ist ein Array, das 3 Elemente enthält. Wir wissen, dass es sich um ein Array handelt, weil es mit einer öffnenden eckigen Klammer beginnt ([
) und endet mit einer schließenden eckigen Klammer (]
). Wir wissen auch, dass jedes Element eine Zeichenfolge ist, weil sie von doppelten Anführungszeichen umgeben sind. Ein Komma trennt jedes Element.
Sehen wir uns nun an, was passiert, wenn wir JSON_QUOTE()
verwenden stattdessen.
SELECT JSON_QUOTE('"Heiß", "Warm", "Kalt"') AS 'Ergebnis';
Ergebnis:
+-------------------------------+| Ergebnis |+------------------------------+| "\"Heiß\", \"Warm\", \"Kalt\"" |+------------------------ --+
Wir bekommen kein Array. Wir bekommen eine Schnur. Wir wissen, dass es sich um eine Zeichenfolge handelt, weil sie mit einem doppelten Anführungszeichen beginnt und endet. Alle doppelten Anführungszeichen innerhalb der Zeichenfolge werden mit dem Backslash-Zeichen maskiert (\
).
Wenn diese Zeichen nicht maskiert wurden, wird das erste doppelte Anführungszeichen (nach Hot
) würde die Zeichenfolge versehentlich beenden. Daher könnten wir den Rest der Zeichenfolge nicht einschließen. Indem wir bestimmte Zeichen maskieren, weisen wir MySQL an, diese Zeichen nicht so zu interpretieren, wie es normalerweise der Fall wäre.
Beispiel 2 – Zahlen
Dasselbe Konzept gilt für Zahlen, außer dass Zahlen nicht in doppelte Anführungszeichen gesetzt werden.
Wir können also ein Array erstellen, das 3 Elemente enthält, die alle Zahlen sind.
SELECT JSON_ARRAY(1, 2, 3) AS 'Ergebnis';
Ergebnis:
+-----------+| Ergebnis |+-----------+| [1, 2, 3] |+-----------+
Und das passiert, wenn wir zu JSON_QUOTE()
wechseln Funktion.
SELECT JSON_QUOTE('[1, 2, 3]') AS 'Ergebnis';
Ergebnis:
+-------------+| Ergebnis |+-------------+| "[1, 2, 3]" |+------------+
Wir erhalten also dasselbe Ergebnis, außer dass das gesamte Array in doppelte Anführungszeichen gesetzt wird. Dies macht es zu einem String anstelle eines Arrays.
Beispiel 3 – Hinzufügen zu Arrays/Objekten
Wir könnten dieses String-Literal nehmen und es als Element in ein Array einfügen.
SELECT JSON_ARRAY(JSON_QUOTE('[1, 2, 3]'), 8, 9) AS 'Ergebnis';
Ergebnis:
+-------------------------+| Ergebnis |+--------------------+| ["\"[1, 2, 3]\"", 8, 9] |+--------------------+
In diesem Fall ist das String-Literal das erste Element mit 8
und 9
die das zweite bzw. dritte Element sind.
Wir könnten dieses String-Literal auch in einem Objekt verwenden.
SELECT JSON_OBJECT('Key', JSON_QUOTE('[1, 2, 3]')) AS 'Ergebnis';
Ergebnis:
+---------------------+| Ergebnis |+---------------------+| {"Schlüssel":"\"[1, 2, 3]\""} |+---------------------+Beispiel 4 – Extrahieren von Werten
Wenn wir also Werte aus unserem JSON-Dokument extrahieren müssen, wird es als String-Literal statt als Array interpretiert.
Zunächst einmal passiert Folgendes, wenn wir ein Array mit den drei Zahlen als separate Elemente festlegen und dann das erste Element aus dem Array extrahieren.
SET @data1 =JSON_ARRAY(1, 2, 3);SELECT @data1 AS '@data1', JSON_EXTRACT(@data1, '$[0]');Ergebnis:
+-----------+------------------------------+| @daten1 | JSON_EXTRACT(@data1, '$[0]') |+-----------+------------------------ ------+| [1, 2, 3] | 1 |+-----------+------------------------------+Dieses Array besteht also aus drei Elementen – jedes Element ist ein separates Element im Array.
Nun, hier ist, was passiert, wenn wir
JSON_QUOTE()
verwenden Um alle drei Zahlen und ihre eckigen Klammern in ein String-Literal umzuwandeln, fügen Sie das dem Array hinzu und extrahieren dann das erste Element des Arrays.SET @data2 =JSON_ARRAY(JSON_QUOTE('[1, 2, 3]'));SELECT @data2 AS '@data2', JSON_EXTRACT(@data2, '$[0]');Ergebnis:
+-------------------+--------------------- ----+| @daten2 | JSON_EXTRACT(@data2, '$[0]') |+-------------------+---------------- --------------+| ["\"[1, 2, 3]\""] | "\"[1, 2, 3]\"" |+-------------------------------+--------------- ---------------+In diesem Fall besteht das Array also nur aus einem Element – dem gesamten String-Literal.