Retrofit 2 는 FastJSon 을 변환기 로 사용 합 니 다.

8215 단어 Android
Retortfit2
Retrofit 는 Square 사가 만 든 안 드 로 이 드 와 자바 의 유형 안전 을 위 한 Http 클 라 이언 트 로 네트워크 서 비 스 는 OkHttp 를 기반 으로 합 니 다.개인 적 으로 더 정확 한 것 은 Retrofit 는 OkHttp 의 포장 도구 류 로 Restful API 를 더욱 편리 하 게 호출 할 수 있다 는 것 이다.
Retrofit 2 기본 제공 변환기
Gson: com.squareup.retrofit2:converter-gson Jackson: com.squareup.retrofit2:converter-jackson Moshi: com.squareup.retrofit2:converter-moshi Protobuf: com.squareup.retrofit2:converter-protobuf Wire: com.squareup.retrofit2:converter-wire Simple XML: com.squareup.retrofit2:converter-simplexml Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars
그러면 문제 가 생 겼 습 니 다. 서버 에서 FastJSon 을 사용 하여 데 이 터 를 직렬 화 합 니 다. 정상 적 인 사용 과 Gson, Jackson 은 차이 가 많 지 않 지만 FastJSon 이 반복 적 인 인용 이 있 는 것 을 발견 하면 자신 이 정의 한 데이터 형식 $ref 를 사용 합 니 다. 그러면 분석 할 때 오류 가 발생 합 니 다.(물론 FastJSon 에 게 이런 인용 형식 을 사용 하지 못 하 게 할 수도 있 습 니 다. 참조https://github.com/alibaba/fastjson/wiki/%E5%BE%AA%E7%8E%AF%E5%BC%95%E7%94%A8)
조건 이 까다 로 워 클 라 이언 트 만 수정 할 수 있다 면 수정 방식 은 두 가지 가 있다.하 나 는 String 을 되 돌려 자체 적 으로 FastJSon 을 사용 하여 해석 하 는 것 으로 이것 도 쉽게 이 루어 진다.두 번 째 는 당연히 확장 변환기 다.
다음은 어떻게 확장 하 는 지 설명 하 겠 습 니 다.
먼저 FastJSonConverterFactory 류 를 만 들 고 Converter. Factory 를 계승 하여 response Body Converter 방법 과 requestBody Converter 방법 을 다시 씁 니 다.

import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;

/**
 *  FastJsonConverterFactory 
* FastJsonCoverter
* Lincoln
* Lincoln
* 2016 03 08 3:48
*
* * @version 1.0.0
*/
public class FastJsonConverterFactory extends Converter.Factory{ public static FastJsonConverterFactory create() { return new FastJsonConverterFactory(); } /** * responseBodyConverter, */ @Override public Converter responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { return new FastJsonResponseBodyConverter<>(type); } /** * responseBodyConverter, */ @Override public Converter, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) { return new FastJsonRequestBodyConverter<>(); } }

FastJSonResponseBodyConverter 클래스 만 들 기

import okhttp3.ResponseBody;
import okio.BufferedSource;
import okio.Okio;
import retrofit2.Converter;

/**
 *  FastJsonResponseBodyConverter 
* ResponseBody
* Lincoln
* Lincoln
* 2016 03 08 3:58
*
* * @version 1.0.0
*/
public class FastJsonResponseBodyConverter<T> implements Converter<ResponseBody, T> { private final Type type; public FastJsonResponseBodyConverter(Type type) { this.type = type; } /* * */ @Override public T convert(ResponseBody value) throws IOException { BufferedSource bufferedSource = Okio.buffer(value.source()); String tempStr = bufferedSource.readUtf8(); bufferedSource.close(); return JSON.parseObject(tempStr, type); } }

FastJSonRequestBodyConverter 만 들 기
import com.alibaba.fastjson.JSON;

import java.io.IOException;

import okhttp3.MediaType;
import okhttp3.RequestBody;
import retrofit2.Converter;

/**
 *  FastJsonRequestBodyConverter 
* RequestBody
* Lincoln
* Lincoln
* 2016 03 08 5:02
*
* * @version 1.0.0
*/
public class FastJsonRequestBodyConverter<T> implements Converter<T, RequestBody> { private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8"); @Override public RequestBody convert(T value) throws IOException { return RequestBody.create(MEDIA_TYPE, JSON.toJSONBytes(value)); } }

사용 방법
 retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(CustomerOkHttpClient.getClient())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                //       FastJsonConverter     
                .addConverterFactory(FastJsonConverterFactory.create())
                .build();

이상 은 FastJSon 을 Retrofit 2 변환기 로 사용 하 는 모든 코드 입 니 다.
github 에 데모 프로젝트 가 적 혀 있어 요. 관심 있 는 거 보 세 요.https://github.com/ChineseLincoln/BaseProject
의존 항목
오늘 (2016 - 07 - 05) github 을 둘 러 보 니 이 코드 는 이미 Maven 중앙 창고 에 올 라 왔 고 AS 를 사용 하 는 친구 들 은 직접 의존 인용 을 사용 할 수 있 습 니 다.
compile 'org.ligboy.retrofit2:converter-fastjson-android:2.1.0'
Retrofit retrofit = new Retrofit.Builder()
  .baseUrl("https://api.example.com")
  .addConverterFactory(FastJsonConverterFactory.create())
  .build();

좋은 웹페이지 즐겨찾기