Quando si lavora con JSON e MySQL, a volte potrebbe essere necessario eseguire l'escape delle stringhe in modo che le virgolette non interferiscano con l'interpretazione del documento JSON. In questi casi, puoi utilizzare JSON_QUOTE()
funzione per sfuggire a stringhe potenzialmente problematiche.
JSON_QUOTE()
viene utilizzato per produrre una stringa JSON valida che può essere inclusa in un documento JSON. Ad esempio, potresti volere che un elemento in un array abbia il testo null
come una stringa letterale, anziché avere un valore nullo effettivo. Questa funzione può essere utilizzata per garantire che il testo venga aggiunto come una stringa letterale, anziché come valore nullo.
Per usarlo, chiama semplicemente la funzione mentre passi la stringa.
Sintassi
La sintassi è questa:
JSON_QUOTE(string)
Dove string
è la stringa di cui eseguire l'escape.
Esempio 1 – Utilizzo di base
Ecco un esempio da dimostrare.
Per prima cosa, diamo un'occhiata a cosa succede quando utilizziamo JSON_ARRAY()
funzione per creare un array.
SELECT JSON_ARRAY("Hot", "Warm", "Cold") AS 'Result';
Risultato:
+-------------------------+ | Result | +-------------------------+ | ["Hot", "Warm", "Cold"] | +-------------------------+
Il risultato è un array che contiene 3 elementi. Sappiamo che è un array perché inizia con una parentesi quadra aperta ([
) e termina con una parentesi quadra di chiusura (]
). Sappiamo anche che ogni elemento è una stringa, perché sono racchiusi tra virgolette. Una virgola separa ogni elemento.
Ora vediamo cosa succede quando utilizziamo JSON_QUOTE()
invece.
SELECT JSON_QUOTE('"Hot", "Warm", "Cold"') AS 'Result';
Risultato:
+-------------------------------+ | Result | +-------------------------------+ | "\"Hot\", \"Warm\", \"Cold\"" | +-------------------------------+
Non otteniamo un array. Otteniamo una stringa. Sappiamo che è una stringa perché inizia e finisce con un carattere di virgolette doppie. Tutte le virgolette doppie all'interno della stringa vengono salvate con il carattere barra rovesciata (\
).
Se questi caratteri non sono stati sottoposti a escape, la prima virgoletta doppia (dopo Hot
) interromperebbe inavvertitamente la stringa. Pertanto, non saremmo in grado di includere il resto della stringa. Escludendo alcuni caratteri, stiamo dicendo a MySQL di non interpretare quei caratteri come farebbe normalmente.
Esempio 2 – Numeri
Lo stesso concetto si applica ai numeri, tranne per il fatto che i numeri non sono racchiusi tra virgolette.
Quindi possiamo creare un array che contiene 3 elementi, tutti numeri.
SELECT JSON_ARRAY(1, 2, 3) AS 'Result';
Risultato:
+-----------+ | Result | +-----------+ | [1, 2, 3] | +-----------+
Ed ecco cosa succede se passiamo a JSON_QUOTE()
funzione.
SELECT JSON_QUOTE('[1, 2, 3]') AS 'Result';
Risultato:
+-------------+ | Result | +-------------+ | "[1, 2, 3]" | +-------------+
Quindi otteniamo lo stesso risultato, tranne per il fatto che l'intero array è racchiuso tra virgolette. Questo lo rende una stringa anziché un array.
Esempio 3 – Aggiunta ad array/oggetti
Potremmo prendere questa stringa letterale e aggiungerla come elemento in un array.
SELECT JSON_ARRAY(JSON_QUOTE('[1, 2, 3]'), 8, 9) AS 'Result';
Risultato:
+-------------------------+ | Result | +-------------------------+ | ["\"[1, 2, 3]\"", 8, 9] | +-------------------------+
In questo caso, la stringa letterale è il primo elemento, con 8
e 9
essendo rispettivamente il secondo e il terzo elemento.
Potremmo anche usare questa stringa letterale in un oggetto.
SELECT JSON_OBJECT('Key', JSON_QUOTE('[1, 2, 3]')) AS 'Result';
Risultato:
+--------------------------+ | Result | +--------------------------+ | {"Key": "\"[1, 2, 3]\""} | +--------------------------+
Esempio 4 – Estrazione di valori
Quindi, se dobbiamo estrarre valori dal nostro documento JSON, verrà interpretato come una stringa letterale anziché come un array.
Innanzitutto, ecco cosa succede se impostiamo un array con i tre numeri come elementi separati, quindi estraiamo il primo elemento dall'array.
SET @data1 = JSON_ARRAY(1, 2, 3); SELECT @data1 AS '@data1', JSON_EXTRACT(@data1, '$[0]');
Risultato:
+-----------+------------------------------+ | @data1 | JSON_EXTRACT(@data1, '$[0]') | +-----------+------------------------------+ | [1, 2, 3] | 1 | +-----------+------------------------------+
Quindi questo array è composto da tre elementi:ogni elemento è un elemento separato nell'array.
Ora, ecco cosa succede se utilizziamo JSON_QUOTE()
per convertire tutti e tre i numeri e le relative parentesi quadre in una stringa letterale, aggiungilo all'array, quindi estrai il primo elemento dell'array.
SET @data2 = JSON_ARRAY(JSON_QUOTE('[1, 2, 3]')); SELECT @data2 AS '@data2', JSON_EXTRACT(@data2, '$[0]');
Risultato:
+-------------------+------------------------------+ | @data2 | JSON_EXTRACT(@data2, '$[0]') | +-------------------+------------------------------+ | ["\"[1, 2, 3]\""] | "\"[1, 2, 3]\"" | +-------------------+------------------------------+
Quindi, in questo caso, l'array è costituito da un solo elemento:l'intera stringa letterale.