Podczas pracy z JSON i MySQL czasami konieczne może być pominięcie ciągów znaków, aby ich znaki cudzysłowu nie przeszkadzały w interpretacji dokumentu JSON. W takich przypadkach możesz użyć JSON_QUOTE()
funkcja ucieczki potencjalnie problematycznych ciągów.
JSON_QUOTE()
służy do tworzenia prawidłowego literału ciągu JSON, który można dołączyć do dokumentu JSON. Na przykład możesz chcieć, aby element w tablicy miał tekst null
jako literał ciągu zamiast rzeczywistej wartości null. Ta funkcja może służyć do zapewnienia, że tekst zostanie dodany jako literał ciągu, a nie wartość null.
Aby go użyć, po prostu wywołaj funkcję podczas przekazywania ciągu.
Składnia
Składnia wygląda tak:
JSON_QUOTE(string)
Gdzie string
jest ciągiem, który ma zostać zmieniony.
Przykład 1 – Podstawowe użycie
Oto przykład do zademonstrowania.
Najpierw spójrzmy, co się dzieje, gdy używamy JSON_ARRAY()
funkcja tworzenia tablicy.
SELECT JSON_ARRAY("Hot", "Warm", "Cold") AS 'Result';
Wynik:
+-------------------------+ | Result | +-------------------------+ | ["Hot", "Warm", "Cold"] | +-------------------------+
Wynikiem jest tablica zawierająca 3 elementy. Wiemy, że jest to tablica, ponieważ zaczyna się od otwierającego nawiasu kwadratowego ([
) i kończy się zamykającym nawiasem kwadratowym (]
). Wiemy również, że każdy element jest łańcuchem, ponieważ są otoczone podwójnymi cudzysłowami. Każdy element oddziela przecinek.
Zobaczmy teraz, co się stanie, gdy użyjemy JSON_QUOTE()
zamiast tego.
SELECT JSON_QUOTE('"Hot", "Warm", "Cold"') AS 'Result';
Wynik:
+-------------------------------+ | Result | +-------------------------------+ | "\"Hot\", \"Warm\", \"Cold\"" | +-------------------------------+
Nie otrzymujemy tablicy. Dostajemy sznurek. Wiemy, że jest to ciąg znaków, ponieważ zaczyna się i kończy znakiem podwójnego cudzysłowu. Wszelkie podwójne cudzysłowy w ciągu są poprzedzone znakiem odwrotnego ukośnika (\
).
Jeśli te znaki nie zostały zmienione, pierwszy podwójny cudzysłów (po Hot
) nieumyślnie zakończy ciąg. Dlatego nie bylibyśmy w stanie dołączyć reszty ciągu. Uciekając niektórymi znakami, mówimy MySQL, aby nie interpretował tych znaków w normalny sposób.
Przykład 2 – Liczby
Ta sama koncepcja dotyczy liczb, z wyjątkiem tego, że liczby nie są ujęte w cudzysłów.
Możemy więc stworzyć tablicę zawierającą 3 elementy, z których wszystkie są liczbami.
SELECT JSON_ARRAY(1, 2, 3) AS 'Result';
Wynik:
+-----------+ | Result | +-----------+ | [1, 2, 3] | +-----------+
A oto, co się stanie, jeśli przełączymy się na JSON_QUOTE()
funkcja.
SELECT JSON_QUOTE('[1, 2, 3]') AS 'Result';
Wynik:
+-------------+ | Result | +-------------+ | "[1, 2, 3]" | +-------------+
Otrzymujemy więc ten sam wynik, z tą różnicą, że cała tablica jest ujęta w podwójne cudzysłowy. To sprawia, że jest to łańcuch zamiast tablicy.
Przykład 3 – Dodawanie do tablic/obiektów
Moglibyśmy wziąć ten literał ciągu i dodać go jako element tablicy.
SELECT JSON_ARRAY(JSON_QUOTE('[1, 2, 3]'), 8, 9) AS 'Result';
Wynik:
+-------------------------+ | Result | +-------------------------+ | ["\"[1, 2, 3]\"", 8, 9] | +-------------------------+
W tym przypadku literał ciągu jest pierwszym elementem, z 8
i 9
będąc odpowiednio drugim i trzecim elementem.
Możemy również użyć tego literału ciągu w obiekcie.
SELECT JSON_OBJECT('Key', JSON_QUOTE('[1, 2, 3]')) AS 'Result';
Wynik:
+--------------------------+ | Result | +--------------------------+ | {"Key": "\"[1, 2, 3]\""} | +--------------------------+
Przykład 4 – Wyodrębnianie wartości
Jeśli więc musimy wyodrębnić wartości z naszego dokumentu JSON, zostanie on zinterpretowany jako literał ciągu zamiast tablicy.
Po pierwsze, oto co się stanie, jeśli ustawimy tablicę z trzema liczbami jako oddzielnymi elementami, a następnie wyodrębnimy pierwszy element z tablicy.
SET @data1 = JSON_ARRAY(1, 2, 3); SELECT @data1 AS '@data1', JSON_EXTRACT(@data1, '$[0]');
Wynik:
+-----------+------------------------------+ | @data1 | JSON_EXTRACT(@data1, '$[0]') | +-----------+------------------------------+ | [1, 2, 3] | 1 | +-----------+------------------------------+
Tak więc ta tablica składa się z trzech elementów – każdy element jest oddzielnym elementem w tablicy.
A oto co się stanie, jeśli użyjemy JSON_QUOTE()
aby wszystkie trzy liczby i ich nawiasy kwadratowe zostały przekonwertowane na literał ciągu, dodaj go do tablicy, a następnie wyodrębnij pierwszy element tablicy.
SET @data2 = JSON_ARRAY(JSON_QUOTE('[1, 2, 3]')); SELECT @data2 AS '@data2', JSON_EXTRACT(@data2, '$[0]');
Wynik:
+-------------------+------------------------------+ | @data2 | JSON_EXTRACT(@data2, '$[0]') | +-------------------+------------------------------+ | ["\"[1, 2, 3]\""] | "\"[1, 2, 3]\"" | +-------------------+------------------------------+
W tym przypadku tablica składa się tylko z jednego elementu – całego literału ciągu.