Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / строка, json и обратные слэши / 6 сообщений из 6, страница 1 из 1
19.05.2017, 13:06
    #39456067
Darkripple
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
строка, json и обратные слэши
добрый день.
так само собой не работает:
Код: sql
1.
select cast('{"Название":"ОАО "Ноги""}' as json);

так тоже не работает:
Код: sql
1.
select cast('{"Название":"ОАО \"Ноги\""}' as json);

так - работает:
Код: sql
1.
select cast('{"Название":"ОАО \\"Ноги\\""}' as json);

вот этот запрос
Код: sql
1.
select concat('{"Название":"ОАО ', char(92), char(92),'"Ноги', char(92), char(92), '""}') tt

выдаёт
{"Название":"ОАО \\"Ноги\\""}

подставляем этот запрос в преобразование json-а
Код: sql
1.
2.
select cast(tt as json) aa
  from (select concat('{"Название":"ОАО ', char(92), char(92),'"Ноги', char(92), char(92), '""}') tt) q

в итоге получаем что-то вообще странное:
"base64:type15:eyLQndCw0LfQstCw0L3QuNC1Ijoi0J7QkNCeIFxcItCd0L7Qs9C4XFw="

изначальный задача:
у меня есть функция,которая на вход принимает JSON в виде текста.
далее внутри функции этот текст преобразуется в JSON - cast(text as json), и потом уже работает с ним.
всё рушится когда на вход функции из php подаётся вот такая строка
'{"Название":"ОАО \"Ноги\""}' .
Получаю
Invalid JSON text in argument 1 to function cast_as_json: "Missing a comma or '}' after an object member." at position ... .

Главный вопрос: как мне полученную на входе строку '{"Название":"ОАО \"Ноги\""}' превратить в json?
...
Рейтинг: 0 / 0
19.05.2017, 13:59
    #39456129
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
строка, json и обратные слэши
Darkrippleкак мне полученную на входе строку '{"Название":"ОАО \"Ноги\""}' превратить в json?
Не понимаю...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
mysql> set @x = '{"Название":"ОАО \\\"Ноги\\\""}';
Query OK, 0 rows affected (0.00 sec)

mysql> select @x;
+--------------------------------------------+
| @x                                         |
+--------------------------------------------+
| {"Название":"ОАО \"Ноги\""}                |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql> select CAST(@x AS JSON);
+---------------------------------------------+
| CAST(@x AS JSON)                            |
+---------------------------------------------+
| {"Название": "ОАО \"Ноги\""}                |
+---------------------------------------------+
1 row in set (0.02 sec)

mysql> select JSON_VALID(@x);
+----------------+
| JSON_VALID(@x) |
+----------------+
|              1 |
+----------------+
1 row in set (0.03 sec)
...
Рейтинг: 0 / 0
19.05.2017, 14:00
    #39456131
Darkripple
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
строка, json и обратные слэши
пока что я понял, что MySQL встречая слэш перед кавычками считает его экранирующим и не воспринимает как часть строки.
соотвественно
Код: sql
1.
select cast('{"Название":"ОАО \"Ноги\""}' as char)

выдаёт
{"Название":"ОАО "Ноги""}
И пара символов \" (слэш и двойная кавычка) для него всё равно что просто двойная кавычка.
Значит мне видимо надо как-то разделять кавычки экранированные слэшем от кавычек json-а, чтобы заменить их на что-то другое...
...
Рейтинг: 0 / 0
19.05.2017, 14:06
    #39456137
Darkripple
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
строка, json и обратные слэши
Akina,
я наверно не правильно обрисовал проблему.
@x у меня на входе такой:
Код: sql
1.
set @x = '{"Название":"ОАО \"Ноги\""}';

соответственно запрос выдаст ошибку.
то есть задача у меня преобразовать '{"Название":"ОАО \"Ноги\""}' в '{"Название":"ОАО \\\"Ноги\\\""}'
...
Рейтинг: 0 / 0
19.05.2017, 14:28
    #39456163
Darkripple
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
строка, json и обратные слэши
сразу скажу что интересует вариант решения внутри MySQL, то есть на входе имеем то, что имеем, и работать надо с этим.

P.S. пока что проблема топорно решена изменением значения параметра в вызывающей системе (внутренняя двойная кавычка просто заменяется на набор символов, с последующим обратным преобразованием уже на стороне MySQL). Но это мне кажется нехорошим вариантом, так как приходится менять код во всех точках вызова.
...
Рейтинг: 0 / 0
19.05.2017, 14:36
    #39456173
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
строка, json и обратные слэши
Darkrippleзадача у меня преобразовать '{"Название":"ОАО \"Ноги\""}' в '{"Название":"ОАО \\\"Ноги\\\""}'
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
USE service

CREATE TABLE quoted_chars(spec_char CHAR(1), quoted_char CHAR(2));

INSERT INTO quoted_chars(spec_char, quoted_char)
SELECT '\\','\\\\'    UNION ALL
SELECT char(0),'\\0'  UNION ALL
SELECT char(8),'\\b'  UNION ALL
SELECT char(9),'\\t'  UNION ALL
SELECT char(10),'\\n' UNION ALL
SELECT char(13),'\\r' UNION ALL
SELECT char(26),'\\Z' UNION ALL
SELECT '\'','\\\''    UNION ALL
SELECT '\"','\\\"'    UNION ALL
SELECT '%','\\%'      UNION ALL
SELECT '_','\\_' ;


Заменяй...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / строка, json и обратные слэши / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]