Уберите первый и последний символы из тела ответа JSON с помощью Retrofit 2 - PullRequest
0 голосов
/ 29 апреля 2019

Для Java-приложения Android, использующего Retrofit 2 и клиента OkHttp, я взаимодействую с сервером, который довольно просто выдает плохой JSON.По какой-то причине он добавляет к JSON открытую скобку, а также добавляет закрывающую скобку и точку с запятой в конце.Пример:

({
  "path" : "D:\\Files",
  "files" : [
    {"name" : "..","type" : "$UP$" },
    {"name" : "Readme.text","type" : "$File$" }
  ]
});

Это явно неправильно (и глупо!), Но я не могу это изменить, и я вынужден с этим жить.Вот как я строю модернизацию:

    Gson gson = new GsonBuilder()
            .setLenient() // Attempt to get around the bad JSON, but didn't really help
            .create();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(baseUrl)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .addCallAdapterFactory(Java9CallAdapterFactory.create())
            .client(mHttpClient)
            .build();

Я думаю, что это довольно стандартно.Я думаю, что лучший способ исправить это с помощью перехватчика OkHttp, который удалит начальные и конечные символы мусора до того, как конвертер Gson его получит.

    public class JsonFixerInterceptor implements Interceptor {
        @Override
        public Response intercept(Chain chain) throws IOException {
            final Request request = chain.request();
            final Response response = chain.proceed(request);

            // Removing the leading garbage character is easy
            response.body().byteStream().skip(1);

            return response;
        }
    }

И вот как создается OkHttpClient:

    OkHttpClient.Builder builder = new OkHttpClient.Builder()
        .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
        .addInterceptor(new JsonFixerInterceptor());

    mHttpClient = builder.build();

Как видите, удалить ведущий символ мусора легко, так как я просто вызываю skip (1).Это делает трюк, но остаются два завершающих мусорных символа, и я не уверен, как их удалить.Одна идея состоит в том, чтобы скопировать поток, за исключением последних двух символов, и создать новый ответ для этого, но я вижу две проблемы: 1) я не уверен, как это сделать, и 2) я беспокоюсь о производительности (данные, вероятно, будут не более 1 МБ, скорее всего менее половины).

Итак, во-первых, использование перехватчика OkHttp - лучший выбор здесь или есть другие варианты?Во-вторых, если это так, как я могу удалить два завершающих символа из тела ответа до того, как конвертер Gson заработает?Так что я знаю, что мои модели и интерфейс для настройки настроены правильно, просто когда я передаю его этому плохому JSON, он выдает «документ JSON не был полностью использован».исключение.

...