对于使用Retrofit 2和OkHttp客户端的Android Java应用程序,我正在与非常简单地生成不良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)我担心性能(数据可能不超过1MB,很可能少于一半)。
首先,使用OkHttp拦截器是这里的最佳选择,还是还有其他选择?其次,如果是这样,我如何在Gson转换器起作用之前从响应正文中删除结尾的两个字符?
ps:我确实使用正确的JSON输入进行了尝试,并且一切正常。因此,我知道我的模型和改造接口设置正确,只是当我向它提供此不良JSON时,它拒绝了“ JSON文档未完全使用”。