Для 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 не был полностью использован».исключение.