Экранирование строк 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 либо был обрезан на середине.
- Отправляется ли мой текст куда-нибудь?
- Нет. И экранирование, и раскодирование выполняются целиком в вашем браузере, поэтому токены, полезные нагрузки и строки логов никогда не покидают ваше устройство.