Ao trabalhar com JSON e MySQL, às vezes você pode precisar escapar strings para que seus caracteres de aspas não interfiram na interpretação do documento JSON. Nesses casos, você pode usar o
JSON_QUOTE()
função para escapar de strings potencialmente problemáticas. JSON_QUOTE()
é usado para produzir um literal de string JSON válido que pode ser incluído em um documento JSON. Por exemplo, você pode querer que um elemento em uma matriz tenha o texto null
como um literal de string, em vez de ter um valor nulo real. Essa função pode ser usada para garantir que o texto seja adicionado como um literal de string, em vez de um valor nulo. Para usá-lo, basta chamar a função enquanto passa a string.
Sintaxe
A sintaxe fica assim:
JSON_QUOTE(string)
Onde
string
é a string a ser escapada. Exemplo 1 – Uso básico
Aqui está um exemplo para demonstrar.
Primeiro, vamos ver o que acontece quando usamos o
JSON_ARRAY()
função para criar uma matriz. SELECT JSON_ARRAY("Quente", "Quente", "Frio") AS 'Resultado';
Resultado:
+-------------------------+| Resultado |+-------------------------+| ["Quente", "Quente", "Frio"] |+------------------------+
O resultado é um array que contém 3 elementos. Sabemos que é uma matriz porque começa com um colchete de abertura (
[
) e termina com um colchete de fechamento (]
). Também sabemos que cada elemento é uma string, porque eles estão entre aspas duplas. Uma vírgula separa cada elemento. Agora vamos ver o que acontece quando usamos o
JSON_QUOTE()
em vez de. SELECT JSON_QUOTE('"Quente", "Quente", "Frio"') AS 'Resultado';
Resultado:
+-------------------------------+| Resultado |+------------------------------------------+| "\"Quente\", \"Quente\", \"Frio\"" |+----------------------------- --+
Não recebemos matriz. Recebemos uma corda. Sabemos que é uma string porque começa e termina com um caractere de aspas duplas. Quaisquer aspas duplas dentro da string são escapadas com o caractere de barra invertida (
\
). Se esses caracteres não foram escapados, as primeiras aspas duplas (depois de
Hot
) terminaria inadvertidamente a string. Portanto, não poderíamos incluir o resto da string. Ao escapar certos caracteres, estamos dizendo ao MySQL para não interpretar esses caracteres como faria normalmente. Exemplo 2 – Números
O mesmo conceito se aplica aos números, exceto que os números não são colocados entre aspas duplas.
Assim, podemos criar uma matriz que contém 3 elementos, todos os quais são números.
SELECT JSON_ARRAY(1, 2, 3) AS 'Resultado';
Resultado:
+-----------+| Resultado |+-----------+| [1, 2, 3] |+-----------+
E aqui está o que acontece se mudarmos para o
JSON_QUOTE()
função. SELECT JSON_QUOTE('[1, 2, 3]') AS 'Resultado';
Resultado:
+-------------+| Resultado |+-------------+| "[1, 2, 3]" |+-------------+
Assim, obtemos o mesmo resultado, exceto que todo o array está entre aspas duplas. Isso faz com que seja uma string em vez de uma matriz.
Exemplo 3 – Adicionando a matrizes/objetos
Poderíamos pegar esse literal de string e adicioná-lo como um elemento em um array.
SELECT JSON_ARRAY(JSON_QUOTE('[1, 2, 3]'), 8, 9) AS 'Resultado';
Resultado:
+-------------------------+| Resultado |+-------------------------+| ["\"[1, 2, 3]\"", 8, 9] |+-------------------------+
Neste caso, a string literal é o primeiro elemento, com
8
e 9
sendo o segundo e terceiro elementos, respectivamente. Também poderíamos usar esse literal de string em um objeto.
SELECT JSON_OBJECT('Chave', JSON_QUOTE('[1, 2, 3]')) AS 'Resultado';
Resultado:
+--------------------------+| Resultado |+--------------------------+| {"Chave":"\"[1, 2, 3]\""} |+--------------------------+Exemplo 4 – Extraindo Valores
Portanto, se precisarmos extrair valores do nosso documento JSON, ele será interpretado como um literal de string em vez de um array.
Primeiro, eis o que acontece se definirmos um array com os três números como elementos separados e, em seguida, extrair o primeiro elemento do array.
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 |+-----------+------------------------------+
Portanto, essa matriz consiste em três elementos – cada elemento é um elemento separado na matriz.
Agora, aqui está o que acontece se usarmosJSON_QUOTE()
para ter todos os três números e seus colchetes convertidos em uma string literal, adicione-os à matriz e extraia o primeiro elemento da 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]\"" |+------------------+--------------- ---------------+
Portanto, neste caso, a matriz consiste em apenas um elemento - o literal de string inteiro.