반응형

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] 

반응형

+ Recent posts