Добавление результатов кодирования GZIP в MalformedJsonException

Я добавил этот заголовок в свой базовый запрос: "Accept-encoding", "gzip"

Теперь это приводит к исключению MalformedJsonException, побуждающему меня использовать JsonReader.setLenient (true)

Я изменил свой код для поддержки этого:

JsonReader jsonReader = new JsonReader(new StringReader(myStringReader with json string));
jsonReader.setLenient(true);
JsonParser parser = new JsonParser();
JsonObject object = parser.parse(jsonReader).getAsJsonObject();

Я все еще получаю ту же ошибку, мысли кто-нибудь?

1 ответ

Пара вещей -

  1. Если вы устанавливаете заголовок GZIP, он сообщает серверу, с которым вы связываетесь, что вы можете распаковать ответ gzip'd. Скорее всего, вы получаете сжатый ответ и пытаетесь разобрать его как json - сначала нужно распаковать его.

  2. Если вы используете HttpUrlConnection, он автоматически установит заголовок gzip и разархивирует его для вас. Вы можете убедиться в этом, проксируя ваше приложение и просматривая http-запросы, которые оно делает.

  3. Забавная вещь о HttpUrlConnection в том, что, хотя он установит заголовок gzip и распакует его для вас, если вы сами установите заголовки gzip, это не так. Затем он будет полагаться на вас, чтобы распаковать его.

Короче говоря, либо вообще не устанавливайте заголовок, а полагайтесь на HttpUrlConnection чтобы сделать все это для вас, или вы должны распаковать ответ, используя GZIPInputStream класс до вашего кода JSON, см. этот ответ для более подробного объяснения:

Как я могу сжать и разархивировать строку, используя GZIPOutputStream, который совместим с.Net?

Другие вопросы по тегам