Při práci s JSON a MySQL může být někdy nutné ukončit řetězce, aby jejich znaky uvozovek nerušily interpretaci dokumentu JSON. V takových případech můžete použít JSON_QUOTE()
funkce pro únik z potenciálně problematických řetězců.
JSON_QUOTE()
se používá k vytvoření platného řetězcového literálu JSON, který lze zahrnout do dokumentu JSON. Můžete například chtít, aby prvek v poli měl text null
jako řetězcový literál, spíše než mít skutečnou hodnotu null. Tuto funkci lze použít k zajištění toho, že text bude přidán jako řetězcový literál, nikoli jako nulová hodnota.
Chcete-li ji použít, jednoduše zavolejte funkci při předávání řetězce.
Syntaxe
Syntaxe vypadá takto:
JSON_QUOTE(řetězec)
Kde string
je řetězec, který má být escapován.
Příklad 1 – Základní použití
Zde je příklad k demonstraci.
Nejprve se podívejme, co se stane, když použijeme JSON_ARRAY()
funkce k vytvoření pole.
SELECT JSON_ARRAY("Horké", "Teplé", "Studené") JAKO 'Výsledek';
Výsledek:
+-------------------------+| Výsledek |+-------------------------+| ["Horké", "Teplé", "Studené"] |+-------------------------+
Výsledkem je pole, které obsahuje 3 prvky. Víme, že se jedná o pole, protože začíná hranatou závorkou ([
) a končí hranatou závorkou (]
). Víme také, že každý prvek je řetězec, protože je obklopen dvojitými uvozovkami. Každý prvek odděluje čárka.
Nyní se podívejme, co se stane, když použijeme JSON_QUOTE()
místo toho.
SELECT JSON_QUOTE('"Horké", "Teplé", "Studené"') AS 'Výsledek';
Výsledek:
+-------------------------------+| Výsledek |+-------------------------------+| "\"Horké\", \"Teplé\", \"Studené\"" |+------------------------------ --+
Nezískáme pole. Získáme provázek. Víme, že je to řetězec, protože začíná a končí znakem dvojitých uvozovek. Jakékoli dvojité uvozovky v řetězci jsou ukončeny znakem zpětného lomítka (\
).
Pokud tyto znaky nebyly escapovány, první dvojitá uvozovka (po Hot
) by neúmyslně ukončilo řetězec. Proto bychom nemohli zahrnout zbytek řetězce. Escapováním určitých znaků říkáme MySQL, aby tyto znaky neinterpretovalo jako normálně.
Příklad 2 – Čísla
Stejný koncept platí pro čísla s tím rozdílem, že čísla nejsou uzavřena do dvojitých uvozovek.
Můžeme tedy vytvořit pole, které obsahuje 3 prvky, z nichž všechny jsou čísla.
SELECT JSON_ARRAY(1, 2, 3) AS 'Result';
Výsledek:
+------------+| Výsledek |+-----------+| [1, 2, 3] |+------------+
A co se stane, když přepneme na JSON_QUOTE()
funkce.
SELECT JSON_QUOTE('[1, 2, 3]') AS 'Výsledek';
Výsledek:
+--------------+| Výsledek |+--------------+| "[1, 2, 3]" |+--------------+
Dostaneme tedy stejný výsledek, až na to, že celé pole je uzavřeno do dvojitých uvozovek. To z něj dělá řetězec namísto pole.
Příklad 3 – Přidání do polí/objektů
Mohli bychom vzít tento řetězcový literál a přidat jej jako prvek v poli.
SELECT JSON_ARRAY(JSON_QUOTE('[1, 2, 3]'), 8, 9) AS 'Výsledek';
Výsledek:
+-------------------------+| Výsledek |+-------------------------+| ["\"[1, 2, 3]\"", 8, 9] |+-------------------------+
V tomto případě je řetězcový literál prvním prvkem s 8
a 9
je druhým a třetím prvkem.
Tento řetězcový literál bychom také mohli použít v objektu.
SELECT JSON_OBJECT('Key', JSON_QUOTE('[1, 2, 3]')) AS 'Result';
Výsledek:
+--------------------------+| Výsledek |+--------------------------+| {"Klíč":"\"[1, 2, 3]\""} |+--------------------------+Příklad 4 – Extrahování hodnot
Pokud tedy potřebujeme extrahovat hodnoty z našeho dokumentu JSON, bude to interpretováno jako řetězcový literál namísto pole.
Nejprve si ukážeme, co se stane, když pole se třemi čísly nastavíme jako samostatné prvky a poté z pole vyjmeme první prvek.
SET @data1 =JSON_ARRAY(1, 2, 3);SELECT @data1 AS '@data1', JSON_EXTRACT(@data1, '$[0]');Výsledek:
+-----------+------------------------------+| @data1 | JSON_EXTRACT(@data1, '$[0]') |+-----------+------------------------ ------+| [1, 2, 3] | 1 |+-----------+------------------------------+Toto pole se tedy skládá ze tří prvků – každý prvek je samostatný prvek v poli.
Nyní se podívejme, co se stane, když použijeme
JSON_QUOTE()
chcete-li všechna tři čísla a jejich hranaté závorky převést na řetězcový literál, přidejte to do pole a poté extrahujte první prvek pole.SET @data2 =JSON_ARRAY(JSON_QUOTE('[1, 2, 3]'));SELECT @data2 AS '@data2', JSON_EXTRACT(@data2, '$[0]');Výsledek:
+-------------------+-------------------------- ----+| @data2 | JSON_EXTRACT(@data2, '$[0]') |+-------------------+---------------- ---------------+| ["\"[1, 2, 3]\""] | "\"[1, 2, 3]\"" |+-------------------+---------------- ---------------+V tomto případě se tedy pole skládá pouze z jednoho prvku – celého řetězcového literálu.