Byte order mark и разбор json_encode

Avatar
  • обновлен
  • Не ошибка

Добрый день, Вы без предупреждения начали добавлять BOM в ваши ответы сервера:

И обычный ответ

0x7b 0x0a 0x20 0x20

Стал превращаться

0xef 0xbb 0xbf 0x7b 0x0a 0x20 0x20

Из-за чего отвалилась функция `json_decode`.

Предупреждайте об этом заранее, пожалуйста.

Мы вообще не трогали код, раньше приходило без BOM.


Решение для пострадавших (PHP):

```

$json_raw_str = ltrim((string)$res->getBody(), chr(239).chr(187).chr(191)); // remove BOM

```

Прикрепленные ответы
Avatar
Специалист Техподдержки
  • Ответ

Проблема еще актуальна?

Avatar
ЕвгенийSo
Цитата от Специалист Техподдержки

Проблема еще актуальна?

Теперь приходят ответы без BOM (и через Guzzle и через Curl проверил), так что нет, не актуальна.

Avatar
ЕвгенийSo
Цитата от Специалист Техподдержки

Можете проверить еще раз?

Теперь снова приходят ответы без BOM.

Хорошо, что я использовал ltrim и паттерн, а не просто отрезал три байта через substr!)

Avatar
ЕвгенийSo
Цитата от Специалист Техподдержки

Добрый день.

Скажите пожалуйста, когда последний раз ответ приходил без BOM?

Неделю назад и ранее ответ точно приходил без BOM, потому что работала функция json_decode:

$client = new GuzzleHttp\Client();

$res = $client->request('POST', '/foo', ['json' => $bar]);

$resultjson = json_decode($res->getBody());

https://www.php.net/manual/en/function.json-decode.php

> If you store your json-string in an utf8-file and read it with file_get_contents, please make sure to strip leading BOM (byte order mark) before decoding it with json_decode. Otherwise json_decode will fail creating an associative array. Instead it will return your data as a string.


Согласно документации (и множеству тем на SO), данная функция обрабатывает данные без BOM.

Сервер не обновляли, Guzzle не обновляли, PHP не обновляли, просто прекратило работать (вчера точно).

Avatar
Специалист Техподдержки
  • Ответ

Проблема еще актуальна?

Avatar

Попробуйте mode=lite, а то Росреестр очень долго отвечает.

Avatar
ЕвгенийSo
Цитата от Специалист Техподдержки

Можете проверить еще раз?

Не могу, Ваш сервер не отвечает. Но это отдельная проблема.

Avatar

Можете проверить еще раз?

Avatar
Специалист Техподдержки
  • На рассмотрении

Добрый день.

Скажите пожалуйста, когда последний раз ответ приходил без BOM?