sql >> Base de Datos >  >> RDS >> Mysql

JSON_QUOTE () - Cómo escapar caracteres en cadenas utilizadas como valores JSON en MySQL

Al trabajar con JSON y MySQL, a veces es posible que necesite escapar cadenas para que sus caracteres de comillas no interfieran con la interpretación del documento JSON. En tales casos, puede usar JSON_QUOTE() función para escapar de cadenas potencialmente problemáticas.

JSON_QUOTE() se utiliza para producir un literal de cadena JSON válido que se puede incluir en un documento JSON. Por ejemplo, es posible que desee que un elemento de una matriz tenga el texto null como un literal de cadena, en lugar de tener un valor nulo real. Esta función se puede usar para garantizar que el texto se agregue como un literal de cadena, en lugar de un valor nulo.

Para usarlo, simplemente llame a la función mientras pasa la cadena.

Sintaxis

La sintaxis es así:

JSON_QUOTE(string)

Donde string es la cadena que se escapará.

Ejemplo 1:uso básico

Aquí hay un ejemplo para demostrarlo.

Primero, veamos qué sucede cuando usamos JSON_ARRAY() función para crear una matriz.

SELECT JSON_ARRAY("Hot", "Warm", "Cold") AS 'Result';

Resultado:

+-------------------------+
| Result                  |
+-------------------------+
| ["Hot", "Warm", "Cold"] |
+-------------------------+

El resultado es una matriz que contiene 3 elementos. Sabemos que es una matriz porque comienza con un corchete de apertura ([ ) y termina con un corchete de cierre (] ). También sabemos que cada elemento es una cadena, porque están entre comillas dobles. Una coma separa cada elemento.

Ahora veamos qué sucede cuando usamos JSON_QUOTE() en su lugar.

SELECT JSON_QUOTE('"Hot", "Warm", "Cold"') AS 'Result';

Resultado:

+-------------------------------+
| Result                        |
+-------------------------------+
| "\"Hot\", \"Warm\", \"Cold\"" |
+-------------------------------+

No obtenemos una matriz. Obtenemos una cadena. Sabemos que es una cadena porque comienza y termina con un carácter de comillas dobles. Las comillas dobles dentro de la cadena se escapan con el carácter de barra invertida (\ ).

Si estos caracteres no se escaparon, la primera comilla doble (después de Hot ) terminaría inadvertidamente la cadena. Por lo tanto, no podríamos incluir el resto de la cadena. Al escapar ciertos caracteres, le estamos diciendo a MySQL que no interprete esos caracteres como lo haría normalmente.

Ejemplo 2 – Números

El mismo concepto se aplica a los números, excepto que los números no están entre comillas dobles.

Entonces podemos crear una matriz que contenga 3 elementos, todos los cuales son números.

SELECT JSON_ARRAY(1, 2, 3) AS 'Result';

Resultado:

+-----------+
| Result    |
+-----------+
| [1, 2, 3] |
+-----------+

Y esto es lo que sucede si cambiamos a JSON_QUOTE() función.

SELECT JSON_QUOTE('[1, 2, 3]') AS 'Result';

Resultado:

+-------------+
| Result      |
+-------------+
| "[1, 2, 3]" |
+-------------+

Entonces obtenemos el mismo resultado, excepto que toda la matriz está encerrada entre comillas dobles. Esto lo convierte en una cadena en lugar de una matriz.

Ejemplo 3:agregar matrices/objetos

Podríamos tomar esta cadena literal y agregarla como un elemento en una matriz.

SELECT JSON_ARRAY(JSON_QUOTE('[1, 2, 3]'), 8, 9) AS 'Result';

Resultado:

+-------------------------+
| Result                  |
+-------------------------+
| ["\"[1, 2, 3]\"", 8, 9] |
+-------------------------+

En este caso, el literal de cadena es el primer elemento, con 8 y 9 siendo el segundo y tercer elemento respectivamente.

También podríamos usar este literal de cadena en un objeto.

SELECT JSON_OBJECT('Key', JSON_QUOTE('[1, 2, 3]')) AS 'Result';

Resultado:

+--------------------------+
| Result                   |
+--------------------------+
| {"Key": "\"[1, 2, 3]\""} |
+--------------------------+

Ejemplo 4:extracción de valores

Entonces, si necesitamos extraer valores de nuestro documento JSON, se interpretará como una cadena literal en lugar de una matriz.

Primero, esto es lo que sucede si establecemos una matriz con los tres números como elementos separados y luego extraemos el primer elemento de la matriz.

SET @data1 = JSON_ARRAY(1, 2, 3);
SELECT 
  @data1 AS '@data1',
  JSON_EXTRACT(@data1, '$[0]');

Resultado:

+-----------+------------------------------+
| @data1    | JSON_EXTRACT(@data1, '$[0]') |
+-----------+------------------------------+
| [1, 2, 3] | 1                            |
+-----------+------------------------------+

Entonces, esta matriz consta de tres elementos:cada elemento es un elemento separado en la matriz.

Ahora, esto es lo que sucede si usamos JSON_QUOTE() para convertir los tres números y sus corchetes en un literal de cadena, agréguelo a la matriz y luego extraiga el primer elemento de la matriz.

SET @data2 = JSON_ARRAY(JSON_QUOTE('[1, 2, 3]'));
SELECT 
  @data2 AS '@data2',
  JSON_EXTRACT(@data2, '$[0]');

Resultado:

+-------------------+------------------------------+
| @data2            | JSON_EXTRACT(@data2, '$[0]') |
+-------------------+------------------------------+
| ["\"[1, 2, 3]\""] | "\"[1, 2, 3]\""              |
+-------------------+------------------------------+

Entonces, en este caso, la matriz consta de un solo elemento:el literal de cadena completo.