Экранирование строк JSON

Экранируйте текст, чтобы он был допустим внутри строки JSON, или раскодируйте экранированный текст в то, что он означает — с точными позициями ошибок.

Текст
Экранированный

Здесь появится вывод

Что делает этот инструмент

Строка JSON не может содержать неэкранированную двойную кавычку, неэкранированный обратный слэш или буквальный перевод строки: формату нужны эти символы, чтобы отмечать, где строки начинаются и заканчиваются. Поэтому они записываются управляющими последовательностями, и этот инструмент преобразует одну форму в другую. Вставьте обычный текст и получите экранированный вариант, готовый к вставке в JSON; поменяйте направление — и экранированный текст снова станет читаемым.

Именно второе направление обычно и приводит сюда людей: строка лога, сообщение об ошибке или ответ curl, пришедший стеной обратных слэшей. Всё выполняется в вашем браузере — это важно, когда вы пытаетесь прочитать продакшен-ответ.

Управляющие последовательности

JSON определяет короткий список экранирований, и инструмент использует именно его — ничего экзотичнее, потому что всё остальное не является допустимым JSON.

  • \" — двойная кавычка, которая иначе закрыла бы строку.
  • \\ — один обратный слэш. Именно поэтому удваиваются пути Windows и шаблоны регулярных выражений.
  • \n и \r — перевод строки и возврат каретки.
  • \t — табуляция. Есть также \b и \f — забой и перевод страницы.
  • \/ — необязательное экранирование прямого слэша. Допустимо, но никогда не требуется; инструмент его принимает и никогда не создаёт.
  • \uXXXX — любой символ по его шестнадцатеричному коду; так записываются управляющие символы и всё, что вне ASCII.

У управляющих символов — всего, что ниже кода 32, — вообще нет буквальной формы внутри строки JSON, поэтому они всегда выводятся как \uXXXX, даже если вы не просили ASCII-вывод.

Почему обратные слэши размножаются

Самая частая причина обратиться к такому инструменту — текст, экранированный больше одного раза. Каждый проход кодирования экранирует обратные слэши, добавленные предыдущим, и одна кавычка обрастает всё более длинным хвостом:

original    He said "hi"
escaped     He said \"hi\"
escaped x2  He said \\\"hi\\\"

Так бывает, когда значение сериализуют в JSON, этот JSON сохраняют строкой внутри другого JSON-документа, а результат пишут в лог. Одно раскодирование снимает один слой; запустите ещё раз на результате, пока текст не станет читаться нормально. Если после раскодирования обратные слэши остались, это действительно ещё один слой, а не ошибка преобразования.

Кавычки: значение или фрагмент

Полное строковое значение JSON включает обрамляющие двойные кавычки. Но чаще всего вы вставляете внутрь строки, которая уже есть в коде или конфигурации, — там эти кавычки были бы лишними. Поэтому экранирование по умолчанию выдаёт только само экранированное содержимое, а опция «включить обрамляющие кавычки» добавляет их, когда нужно значение, которое вставляется целиком.

Раскодированию такой выбор не нужен — оно принимает обе формы. Вставьте фрагмент или вставьте целое значение в кавычках прямо из JSON-документа: обрамляющие кавычки распознаются и снимаются.

Unicode — и когда его всё же экранировать

JSON — формат Unicode. «שלום» и «😀» — совершенно допустимые строки JSON ровно в том виде, в каком написаны, и оставлять их читаемыми здесь принято по умолчанию. Опция \uXXXX существует для систем, которые не поспевают: старых конвейеров логов, терминалов и парсеров, предполагающих ASCII и портящих всё остальное.

Когда эта опция включена, важна одна деталь. Символы за пределами базового диапазона — большинство эмодзи — хранятся внутри как две единицы, называемые суррогатной парой, и формат требует, чтобы обе половины записывались отдельными экранированиями. Поэтому эмодзи превращается в два \u, а не в одно более длинное. Инструменты, которые здесь ошибаются, выдают экранирования, не принимаемые ни одним парсером, — обычное объяснение эмодзи, переживших одну систему и сломавшихся в следующей.

Когда раскодирование не удаётся

Не всякая последовательность с обратным слэшем — допустимое экранирование. \q в JSON не значит ничего, а \u12 — это \u, которому не хватает половины цифр. Вместо того чтобы пропустить их без изменений и вернуть вывод, который выглядит правильным, но не соответствует вашим данным, инструмент останавливается и сообщает точные строку и столбец, где начинается сбойная последовательность.

На практике эта ошибка информативна: одинокий \q обычно означает, что текст вообще не экранировался для JSON, а обрезанный \u — что вход был усечён: строка лога, подрезанная ограничением длины, или копия, остановившаяся посреди последовательности.

Частые вопросы

Почему в моём тексте повсюду \\"?
Он экранировался больше одного раза. Каждый проход экранирует обратные слэши предыдущего, поэтому перед одной исходной кавычкой может оказаться несколько. Раскодируйте многократно — каждый запуск снимает ровно один слой — пока текст не станет читаться нормально.
Нужно ли включать обрамляющие кавычки?
Только если вам нужно готовое значение JSON для вставки как есть — например, целиком правая часть ключа. Если вы вставляете внутрь строки, уже существующей в коде, оставьте опцию выключенной, иначе получите кавычки внутри кавычек.
Нужно ли экранировать иврит, арабский, китайский или эмодзи?
Нет. Строки JSON — это Unicode, поэтому такие символы допустимы как есть и по умолчанию остаются читаемыми. Включайте \uXXXX только тогда, когда система дальше по цепочке требует чистый ASCII; эмодзи тогда записываются двумя обязательными суррогатными экранированиями.
Что означает «недопустимая управляющая последовательность»?
Во вводе есть обратный слэш, за которым идёт то, чего JSON не определяет, например \q, либо \u без четырёх шестнадцатеричных цифр после него. Позиция сообщается, чтобы вы посмотрели именно туда: обычно текст изначально не экранировался для JSON либо был обрезан на середине.
Отправляется ли мой текст куда-нибудь?
Нет. И экранирование, и раскодирование выполняются целиком в вашем браузере, поэтому токены, полезные нагрузки и строки логов никогда не покидают ваше устройство.