Retrofit 解析GSON

/** A {@linkplain Converter.Factory converter} which uses Jackson. */
public final class JacksonConverterFactory implements Converter.Factory {
    /** Create an instance using a default {@link ObjectMapper} instance for conversion. */
    public static JacksonConverterFactory create() {
        return create(new ObjectMapper());
    }

    /** Create an instance using {@code mapper} for conversion. */
    public static JacksonConverterFactory create(ObjectMapper mapper) {
        return new JacksonConverterFactory(mapper);
    }

    private final ObjectMapper mapper;

    private JacksonConverterFactory(ObjectMapper mapper) {
        if (mapper == null) throw new NullPointerException("mapper == null");
        this.mapper = mapper;
    }

    /** Create a converter for {@code type}. */
    @Override public Converter<?> get(Type type) {
        JavaType javaType = mapper.getTypeFactory().constructType(type);
        ObjectWriter writer = mapper.writerWithType(javaType);
        ObjectReader reader = mapper.reader(javaType);
        return new JacksonConverter<>(writer, reader);
    }
}

<pre name="code" class="java">class JacksonConverter<T> implements Converter<T> {
    private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=utf-8");

    private final ObjectWriter writer;
    private final ObjectReader reader;

    JacksonConverter(ObjectWriter writer, ObjectReader reader) {
        this.writer = writer;
        this.reader = reader;
    }


    @Override
    public T fromBody(ResponseBody body) throws IOException {

        String jsonString = new String(body.string());

        while (jsonString != null && jsonString.startsWith("\ufeff")) {
            jsonString =
                    jsonString.substring(1);
        }
        if(Constants.DEBUG)
            Log.d("********",jsonString);
        return reader.readValue(jsonString);
    }

    @Override
    public RequestBody toBody(T value) {
        try {
            if (value instanceof RequestBody) {
                return (RequestBody) value;
            }

            byte[] bytes = writer.writeValueAsBytes(value);
            return RequestBody.create(MEDIA_TYPE, bytes);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
}
<pre name="code" class="java">    @Provides
    @Singleton
    Retrofit provideRetrofit() {
        File cacheDir = new File(String.valueOf(application.getCacheDir()), "HttpResponseCache");
        OkHttpClient okHttpClient = new OkHttpClient();
        okHttpClient.setCache(new Cache(cacheDir, 10 * 1024 * 1024));
        okHttpClient.setConnectTimeout(2 * 1000, TimeUnit.MILLISECONDS);
        okHttpClient.setReadTimeout(60 * 1000, TimeUnit.MILLISECONDS);
        okHttpClient.interceptors().add(new LoggingInterceptor());
        Retrofit retrofit = new Retrofit.Builder()
                .client(okHttpClient)
                .baseUrl(HTTP_URL)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(JacksonConverterFactory.create())
                .build();
        return retrofit;
    }


 



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值