it-swarm.com.de

Fügen Sie maskierte doppelte Anführungszeichen in das MySQL JSON-Feld ein

Ich versuche, einen String-JSON einzufügen, der folgendermaßen aussieht:

'{"test": "string with \"escaped quotes\" does not work"}'

in ein MySQL JSON-Feld, aber ich bekomme immer den Fehler:

SQL-Fehler (3140): Ungültiger JSON-Text: "Nach einem Objektelement fehlt ein Komma oder '}'."
an Position 24 im Wert (oder in der Spalte) '{"test": "Zeichenfolge mit" Escape-Anführungszeichen "funktioniert nicht"}'.

Irgendeine Idee, was das Problem verursachen könnte?

Die vollständige INSERT Anweisung lautet:

INSERT INTO test(json_test)
VALUES ('{"test": "string with \"escaped quotes\" does not work"}');
4
Ruehri

Lassen Sie uns die Tabelle erstellen:

mysql> create table jsontest (id serial, value json);
Query OK, 0 rows affected (0.02 sec)

mysql> show create table jsontest\G
*************************** 1. row ***************************
Table: jsontest
Create Table: CREATE TABLE `jsontest` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `value` json DEFAULT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

Und fügen Sie einige JSON-Daten/Objekte ein:

mysql> INSERT INTO jsontest(value) VALUES (JSON_OBJECT('test', 'string with "escaped quotes" does not work'));
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO jsontest(value) VALUES ('{"test": "string with \\"escaped quotes\\" does not work"}');
Query OK, 1 row affected (0.01 sec)

mysql> select id, value->>"$.test" from jsontest;
+----+--------------------------------------------+
| id | value->>"$.test"                           |
+----+--------------------------------------------+
|  2 | string with "escaped quotes" does not work |
|  9 | string with "escaped quotes" does not work |
+----+--------------------------------------------+
2 rows in set (0.00 sec)

Wie Sie hier sehen können, müssen Sie die Escape-Sequenz mit doppeltem Backslash verwenden, da der SQL-Parser nicht die Standardverarbeitung der Escape-Sequenz ausführen soll, sondern stattdessen die Literalzeichenfolge mit der Escape-Sequenz an die Speicher-Engine für das übergeben soll JSON-Datentypverarbeitung.

Ich werde mit dem MySQL-Dokumententeam darüber sprechen, hier einige Beispiele und Erklärungen hinzuzufügen:

12.6 Der JSON-Datentyp - Erstellen von JSON-Werten

3
Matt Lord

Ich möchte hinzufügen, dass der Wert, der mit doppelte Schrägstriche in die Tabelle eingefügt wird

INSERT INTO jsontest(value) 
VALUES ('{"test": "string with \\"escaped quotes\\" does not work"}');

... wäre immer noch {"test": "string with \"escaped quotes\" does not work"} Dies ist ein gültiges Json-Format.

Es ist die Art und Weise, wie wir die eingefügten Daten abfragen, die hier den Unterschied macht :

Beispiel

mysql> select id, value->>"$.test" from jsontest;

gibt:

"string with "escaped quotes" does not work"

als Ausgabe, aber wenn wir fragen:

mysql>select value from jsontest;

... es wird immer noch {"test": "string with \"escaped quotes\" does not work"} als Ausgabe. Das Gute ist, dass wir mit dem Json-Typ Werte direkt abfragen und anhand der entsprechenden Schlüssel extrahieren können:

mysql> SELECT JSON_EXTRACT('{"id": 14, "SampleKey": "SampleValue"}', '$.SampleKey');

Gibt "SampleValue" als Ausgabe.

Um den Json-Datentyp zu verwenden, sollte die eingefügte Zeichenfolge ein gültiger und ordnungsgemäß formatierter Json sein.

0
Shivam Kumar