0
Не ошибка

Byte order mark и разбор json_encode

ЕвгенийSo 1 год назад обновлен Специалист Техподдержки 1 год назад 9

Добрый день, Вы без предупреждения начали добавлять 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

```

Ответ

+1
Ответ

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

+1
Ответ

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

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

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

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

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

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

На рассмотрении

Добрый день.

Скажите пожалуйста, когда последний раз ответ приходил без 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 не обновляли, просто прекратило работать (вчера точно).

Сервис поддержки клиентов работает на платформе UserEcho