使用Retrofit 2从JSON响应正文中删除第一个和最后一个字符

时间:2019-04-29 04:08:53

标签: java android json gson retrofit2

对于使用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文档未完全使用”。

0 个答案:

没有答案