Недавно столкнулся с одной проблемой.
У меня есть клиент, который генерирует подпись на основе строки 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]'