Двойное экранирование обычно означает, что одна строка JSON сохранена внутри другой. Видимые обратные слеши принадлежат разным слоям синтаксического анализа, поэтому декодировать до «похожего текста» нельзя.
Считайте границы, а не слеши
Начните с форматов источника и назначения. Перевод строки в обычном тексте становится \n в первой строке JSON. Если всю эту строку сериализовать как ещё одну строку JSON, обратный слеш тоже экранируется и во внешнем представлении выглядит как \\n. Просмотрщик логов может добавить слой отображения. Считайте реальные границы сериализации и сохраняйте известный пример, а не судите только по числу видимых слешей.
Снимайте один проверенный слой
EscapeJSON выполняет один проход и показывает результат как обычный текст. Если результат сам является строкой JSON в кавычках, он остаётся видимым, пока вы явно не используете его повторно. Так путь, шаблон или фрагмент лога с намеренными слешами не преобразуется рекурсивно. После каждого прохода сверяйте текст с контрактом источника, прежде чем пересекать следующую границу или считать его структурированным JSON.
Проверьте назначение и число слоёв
Сверяйте результат с контрактами источника и назначения. Экранирование защищает только грамматику одной строки JSON и не санитизирует HTML, SQL, JavaScript, командную оболочку или другой синтаксический анализатор. Снимайте по одному проверенному слою, отклоняйте повреждённый Unicode и сохраняйте известный тестовый пример для важных интеграций.