Retrofit 2 는 FastJSon 을 변환기 로 사용 합 니 다.
8215 단어 Android
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();
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.