반응형
gson 을 사용할 떄 json 구조에 맞춰서 fromJson 메소드를 호출하면 자동으로 파싱을 해주지만,
종종 커스텀을 해서 파싱을 해야 할떄가 있다.
1. 해야하는 순간은 해당 데이터가 모두 동일한 포맷으로 파싱이 되어야 한다든지,
EX) 공백 "" 스트링이 있으면 항상 null 로 치환, 또는 날짜가 포함된 경우 동일한 포맷으로 파싱해야 하는 경우.
2. 일반적인 방식으로 파싱이 어려운 경우
EX) json 객체의 키값이 가변적인 경우여서 객체명으로 파싱이 불가능할 경우
{
"1234": {
"name" : "cat"
},
"5594": {
"name": "dog"
}
}
EX) 같은 json 키 이지만 값에 value 에 따라 파싱되는 객체 구조가 다를 경우
여기서 registerTypeAdapter 에 넣는 class 에 따라 해당 클래스가 있는 json 이 gson 으로 파싱될떄 deserializer 가 호출된다.
String.class 를 넣으면 파싱되는 데이터타입중에 String 인 데이터는 모두 deserialize 를 호출하게 된다.
CustomDeserializer 클래스
public class CustomDeserializer implements JsonDeserializer<ReturnVo> {
/**
* JsonElement json parameter 은 parsing 하려는 전체 json 데이터
*/
@Override
public ReturnVo deserialize(JsonElement json, java.lang.reflect.Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
ReturnVo returnVo = new ReturnVo();
JsonObject jsonObject = json.getAsJsonObject();
/**
파싱
*/
return returnVo;
}
}
사용 예시
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(ReturnVo.class, new CustomDeserializer());
Gson gson = builder.create();
ReturnVo response = gson.fromJson(jsonStr, ReturnVo.class); /** fromJson 호출시 CustomDeserializer 가 호출됨*/
return response;
참고문헌
> https://stackoverflow.com/questions/28319473/gson-same-field-name-different-types [Same field name, different types]
반응형
'Java > Java Library' 카테고리의 다른 글
XJC(JAXB binding compiler) 로 .xsd 파일을 java 객체로 변환하기 (0) | 2021.02.11 |
---|---|
[Java] 자바 문자열로 된 수식 계산하기 - 스크립트 엔진 (0) | 2021.02.09 |
[Java Library] gson casting 오류 com.google.gson.internal.LinkedTreeMap cannot be cast to my class - jsonlist 를 List 객체로 만들기 (0) | 2021.01.28 |
sftp java 접속 라이브러리 jsch (0) | 2021.01.27 |
[okhttp3] okhttp IOException: unexpected end of stream on Address (0) | 2020.12.17 |