JSON формат, экранирование символов

О чем здесь будет речь. О том как использовать Json формат данных в GUI приложении Windows с использованием удаленной базы MySql на сервере в интернете.

Приложениие на Qt обменивается информацией с сервером по HTTP json протоколу.

Например серверу посылается в теле байты:

{"aaa":"bbb\"bb\'b"}

Двойные кавычки

Тут видно , что символ двойные кавычки экранируется, так как если не экранировать двойные кавычки внутри блока данных , заключённых в такие же двойные кавычки, то целостность  блока  нарушится и вам структуру json на сервере не удастся корректно декодировать через jsob_decode (php).

Также в блоке данных , заключённых в двойные кавычки, нельзя передавать символы переноса строки \n, так как блок данных не должен никогда переносится на новую строку.

Это все ограничения по целостности данных. Сами символы " {dfg } ] [ff : , dd" могут нормально находится внутри блока данных, ограниченных двойными кавычками.

Обратно сервер отвечает таким же способом, кодируя свои Json данные через json_encode.

Это все понятно с небольшими нюансами.

Но далее данные из полученного json пакета сервер хочет сохранить в базе MySql.

И тут надо еще раз экранировать экранированные символы, чтобы избежать умышленного вредительства (sql инъекции и т.д.).

То есть переменную aaa надо сохранять в виде:

bbb\\\"bb\\\'b

Впоследствии, когда мы будем (допустим к примеру) считывать переменную aaa из базы и передавать нашему приложению в http запросе, то данные уже экранировать возможно не надо.


В приложение мы обратно должны в http ответе также получить экранированные символы как и при передаче серверу:

{"aaa":"bbb\"bb\'b"}

Далее в приложении (на Qt) мы сохраняем переменную aaa допустим в виджет QLineEdit и там видим ее уже так (без экранирования):

bbb"bb'b

И это тоже правильно.

Далее редактируем ее в в QLineEdit как нам вздумается добавляя все возможные символы и спец.символы.

Потом опять сохраняем эти данные на сервере, но предварительно экранируем двойные кавычки и обратный слэш.
Точнее сначала экранируем обратный слэш, а потом двойную кавычку.

И в результате мы теперь гоняем данные туда сюда корректно.

base64

Как вариант можно не заморачиваться с экранированием вообще и передавать все данные закодированные через base64. И в таком же виде сохранять их в базе данных. 

Можно частично кодировать в base64 некоторые блоки данных и далее на сервере раскодировать и сохранять в базе данных раскодированными. В этом случае в базе можно переносы строк увидеть и табуляции и т.д. Иногда это удобно.

Одинарные кавычки

Одинарные кавычки надо экранировать уже при записи в саму базу данных (mysql например), так как формат sql строки использует одинарные кавычки для указания значения строки SET `aaaa`='dfgf\'ggg'    .