Retrofit - removing some invalid characters from response body before parsing it as json

后端 未结 4 2138
旧巷少年郎
旧巷少年郎 2020-12-30 09:58

I have an external web service that in the response body returns json but nested in parentheses, like this:

({\"door_x\":\"103994.001461\",\"door_y\":\"98780         


        
4条回答
  •  清酒与你
    2020-12-30 10:39

    Solution For Retrofit 2

    The code below is the same as the GsonConverter except you can edit the Response before converting to its model

    Edit public T convert(ResponseBody value) to clean your Response

    /**
     * Modified by TarekkMA on 8/2/2016.
     */
    
    public class MyJsonConverter extends Converter.Factory {
    
        public static MyJsonConverter create() {
            return create(new Gson());
        }
    
        public static JsonHandler create(Gson gson) {
            return new JsonHandler(gson);
        }
    
        private final Gson gson;
    
        private JsonHandler(Gson gson) {
            if (gson == null) throw new NullPointerException("gson == null");
            this.gson = gson;
        }
    
        @Override
        public Converter responseBodyConverter(Type type, Annotation[] annotations,
                                                                Retrofit retrofit) {
            TypeAdapter adapter = gson.getAdapter(TypeToken.get(type));
            return new GsonResponseBodyConverter<>(gson, adapter);
        }
    
        @Override
        public Converter requestBodyConverter(Type type,
                                                              Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
            TypeAdapter adapter = gson.getAdapter(TypeToken.get(type));
            return new GsonRequestBodyConverter<>(gson, adapter);
        }
    
    
        final class GsonRequestBodyConverter implements Converter {
            private final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
            private final Charset UTF_8 = Charset.forName("UTF-8");
    
            private final Gson gson;
            private final TypeAdapter adapter;
    
            GsonRequestBodyConverter(Gson gson, TypeAdapter adapter) {
                this.gson = gson;
                this.adapter = adapter;
            }
    
            @Override
            public RequestBody convert(T value) throws IOException {
                Buffer buffer = new Buffer();
                Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8);
                JsonWriter jsonWriter = gson.newJsonWriter(writer);
                adapter.write(jsonWriter, value);
                jsonWriter.close();
                return RequestBody.create(MEDIA_TYPE, buffer.readByteString());
            }
        }
    
        final class GsonResponseBodyConverter implements Converter {
            private final Gson gson;
            private final TypeAdapter adapter;
    
            GsonResponseBodyConverter(Gson gson, TypeAdapter adapter) {
                this.gson = gson;
                this.adapter = adapter;
            }
    
            @Override
            public T convert(ResponseBody value) throws IOException {
                String dirty = value.string();
                String clean = dirty.replace("\r\n" +
                        "","").replace("","");
                try {
                    return adapter.fromJson(clean);
                } finally {
                    value.close();
                }
            }
        }
    
    
    }
    
    • Another solution is to blame the inexperienced backend developer.

提交回复
热议问题