Недавно столкнулся с одной проблемой.

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

Возьмем пример:
Предположим, что тело запроса: {"name":"mjuuh","description":"new service"}

Если вы создадите тело запроса JSON в одной строке в почтальоне, вы получите тело запроса в формате строки json как «{\» имя \»: \»kddjdososos\», \»описание\»:\»новая служба\» }”

Теперь, если вы используете несколько строк, как показано ниже

Строка json, сгенерированная почтальоном, будет следующей: «{\»name\»:\»kddjdososos\»,\n\»description\»:\»new service\»}»

Вы видели ‘\n’?
Да, это правильный json.

Но если да,
var a=JSON.parse("{\"имя\":\"kddjdososos\",\"описание\":\"новый сервис\"}");

var b=JSON.parse("{\"имя\":\"kddjdososos\",\n\"описание\":\"новая служба\"}");

а и б будут одинаковыми.

Примечание. Но подпись для одного и того же объекта JSON была другой, потому что их строковое представление JSON было другим.

Определение JSON.stringify
Метод JSON.stringify() преобразует значение JavaScript в строку JSON, при необходимости заменяя значения, если указана функция-заменитель, или дополнительно включая только указанные свойства, если указан массив-заменитель.

Синтаксис

JSON.stringify(значение[, replacer[, пробел]])

Параметры
1) значение
Значение для преобразования в строку JSON.

2) replacer(необязательно)
Функция, которая изменяет поведение процесса преобразования строк, или массив объектов String и Number, которые служат в качестве белого списка для выбора / фильтрация свойств объекта значения для включения в строку JSON. Если это значение равно null или не указано, все свойства объекта включаются в результирующую строку JSON.

3) space(Необязательно)
Объект String или Number, который используется для вставки пробела в выходную строку JSON для удобства чтения.
Если это это число, оно указывает количество пробелов, используемых в качестве пробела; это число ограничено 10 (если оно больше, значение равно 10). Значения меньше 1 означают, что пробел использовать не следует.

Если это строка, строка (или первые 10 символов строки, если она длиннее) используется в качестве пробела. Если этот параметр не указан (или имеет значение NULL), пробел не используется.

Примеры:
JSON.stringify({}); // '{}'

JSON.stringify(true); // 'true'

JSON.stringify('foo'); // '"foo"'

JSON.stringify([1, 'false', false]); // '[1,"false",false]'

JSON.stringify([NaN, null, Infinity]); // '[null,null,null]'