안녕하세요, 봉자씨입니다.


안드로이드에서 api를 호출할 경우 자주 사용하는 retrofit2

이를 사용하다 보면 json데이터를 파싱하는 경우가 많습니다. 

이럴 경우 아래와 같이 사용하여 처리를 했습니다.


Retrofit client = new Retrofit.Builder()
.baseUrl("http://bongjacy.com/")
.client(new OkHttpClient()).addConverterFactory(GsonConverterFactory.create()).build();


이렇게 사용하다 보면 특정 데이터에서 null이 들어 오는 경우가 있습니다.

또는 숫자라고 생각하고 이를 String으로 받아서 바꿔 사용하고 있다면 Inteager.Valueof를 사용하다 보면 Exception이 발생하게 됩니다.

당연하죠.. 데이터가 없으니

이럴 경우 null일 때는 "0"으로 넣어야 하는 경우가 생기더라고요.(순전히 저의 경우지만...^^;;)

이를 해결하기 위해서 아래와 같은 소스 코드를 추가해 주시면 됩니다.

기본적 셋팅 부분은 아래와 같이 하시면 됩니다.


GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()).create();
gsonBuilder.serializeNulls();
Gson gson = gsonBuilder.create();
Retrofit client = new Retrofit.Builder()
.baseUrl("http://bongjacy.com/")
.client(new OkHttpClient()).addConverterFactory(GsonConverterFactory.create(gson)).build();


그리고 두개의 클래스를 추가합니다.

첫번째 StringAdapter입니다.

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

import java.io.IOException;

public class StringAdapter extends TypeAdapter<String> {
public String read(JsonReader reader) throws IOException {
if (reader.peek() == JsonToken.NULL) {
reader.nextNull();
return "0"; //여기서 null일 경우에는 0으로 치환해서 보내게 됩니다. 핵심!
}
return reader.nextString();
}
public void write(JsonWriter writer, String value) throws IOException {
if (value == null) {
writer.nullValue();
return;
}
writer.value(value);
}
}


두번째 NullStringToEmptyAdapterFactory입니다. 기본 셋팅 부분에 추가됐던 TypeAdapterFactory 클래스입니다.

import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;

public class NullStringToEmptyAdapterFactory<T> implements TypeAdapterFactory {
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {

Class<T> rawType = (Class<T>) type.getRawType();
if (rawType != String.class) {
return null;
}
return (TypeAdapter<T>) new StringAdapter();
}
}


이렇게 해주시면 null to zero가 되게 됩니다.

감사합니다.

글이 조금이나마 도움이 되셨다면 공감 부탁드립니다.

오늘도 좋은 하루 되세요!

감사합니다.

클릭 클릭 공감 클릭~~





+ Recent posts