Добавление результатов кодирования 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 ответ
Пара вещей -
Если вы устанавливаете заголовок GZIP, он сообщает серверу, с которым вы связываетесь, что вы можете распаковать ответ gzip'd. Скорее всего, вы получаете сжатый ответ и пытаетесь разобрать его как json - сначала нужно распаковать его.
Если вы используете
HttpUrlConnection
, он автоматически установит заголовок gzip и разархивирует его для вас. Вы можете убедиться в этом, проксируя ваше приложение и просматривая http-запросы, которые оно делает.Забавная вещь о
HttpUrlConnection
в том, что, хотя он установит заголовок gzip и распакует его для вас, если вы сами установите заголовки gzip, это не так. Затем он будет полагаться на вас, чтобы распаковать его.
Короче говоря, либо вообще не устанавливайте заголовок, а полагайтесь на HttpUrlConnection
чтобы сделать все это для вас, или вы должны распаковать ответ, используя GZIPInputStream
класс до вашего кода JSON, см. этот ответ для более подробного объяснения:
Как я могу сжать и разархивировать строку, используя GZIPOutputStream, который совместим с.Net?