Являются Ли Ключи Чувствительными К Регистру В Json?

Конечно да, скажете вы.

Но этой статьи не было бы, если бы не было вопроса.

Эта статья также будет вам полезна, если вы пользуетесь эквайрингом от Тинькофф.

Немного предыстории.

Некоторое время назад на одном из своих проектов я сменил онлайн-эквайринг на Тинькофф, и после отладки стали выскакивать странные ошибки с оплатой: неправильно была рассчитана хэш-подпись запроса.

Причём только по реальным выплатам, что ещё больше омрачило ситуацию.

Проблема была в поле Данные json, который поступает от банка в уведомлении о платеже.

В некоторых случаях это выглядит как Данные и в других ДАННЫЕ (верхний регистр).

Я сообщил о проблеме в службу поддержки Тинькофф, и тут началось интересное.

Служба поддержки утверждает, что регистр ключей в JSON не имеет значения:

Валерий, здравствуйте, JSON не чувствителен к регистру.

С его точки зрения, ДАННЫЕ и Данные — это одно и то же.

Корень проблемы здесь в вашем программном обеспечении, которое чувствительно к регистру.

К сожалению, технические специалисты Тинькофф не смогли доказать обратное.

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

JavaScript – как самый популярный

Когда люди говорят о JSON, самым популярным языком, который его использует, является JS.
  
  
   

const json = JSON.parse('{"Data":1,"DATA":2}'); console.log(json, json.Data); // {Data: 1, DATA: 2} 1

Как видите, реестр ключей играет роль.

Два разных ключа с разными значениями.

И если в документации указан ключ Данные , Что ДАННЫЕ не получится, к сожалению.



PHP — когда нет JS

Возможно, будет разница между массивом и объектом?

<Эphp $json = json_decode('{"Data":1,"DATA":2}', true); var_dump($json); // array (size=2) // 'Data' => int 1 // 'DATA' => int 2 $json = json_decode('{"Data":1,"DATA":2}', false); var_dump($json); // object(stdClass)[253] // public 'Data' => int 1 // public 'DATA' => int 2

Ситуация аналогичная.

Ключи в разных регистрах — это разные ключи.

Преобразование в массив или объект не имеет значения.



Go — строго типизированный язык

Тем не менее, JS и PHP допускают много вольности.

Возможно, строго типизированный компилируемый язык будет вести себя иначе?

var data map[string]interface{} json.Unmarshal([]byte("{\"Data\":1,\"DATA\":2}"), &data) fmt.Println(data) // map[DATA:2 Data:1]

И опять же, ключи в разных регистрах — это разные ключи.

Мы получили карту с двумя разными ключами и значениями.



C# – включена нечувствительность к регистру

В комментариях разместил пример код для C# Поведение либо как в других языках, либо можно включить нечувствительность к регистру и ловить ошибки при наложении свойств (хотя в случае с одним свойством разницы действительно не будет).



Заключение

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

Я не видел языка, в котором JSON не чувствителен к регистру.

Если знаете, дайте знать, будет интересно.

P.S. Я уверен, что разработчики Тинькофф тоже читают Хабр.

Пожалуйста, обратите внимание на проблему.

В вашем продукте регистр ключа данных в уведомлении о платеже меняется случайным образом.

UPD 19.04.22 14:50 Спасибо @Бусла за найденное упоминание чувствительность к регистру в спецификации .

Теги: #Разработка сайтов #Go #JavaScript #php #tinkoff #json

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.