seoft

[java, kotlin] 상속관계 리스트 json타입, 객체타입 전환 (with gson) 본문

android

[java, kotlin] 상속관계 리스트 json타입, 객체타입 전환 (with gson)

seoft 2020. 5. 16. 17:08

사이드 프로젝트 도중 다형성을 이용해 생성된 리스트를 json을 서버에 주고 받을 상황이 생겼다. 일반적으로 한타입의 List를 json화 해봤었지만 다양한 타입을 json화, 객체화 해올 일이 없어 찾아보면서 한번 정리 해본다.

 

큰 방향은 하위 객체 json에 type key값을 두고 내부적으로 해당 key값을 통해 타입을 설정하는 것 같다.

 

이 방식을 통해서 다음 java 파일이 필요하다.

 

https://github.com/google/gson/blob/master/extras/src/main/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactory.java

 

google/gson

A Java serialization/deserialization library to convert Java Objects into JSON and back - google/gson

github.com

RuntimeTypeAdapterFactory.java 파일 추가 후 다음과 같이 구현하면 된다.

 

 

json타입, 객체타입 전활 할 모델 :

상위클래스의 타입명(다음 예제에서는 "type")을 대입한 하위 클래스에서 값("cat","dog")을 설정해주고,

RuntimeTypeAdapterFactory 생성시에 알맞게 넣어주어야 한다.

 

 

 

코틀린을 사용 할 경우 익스텐션 :

코틀린 경우 익스텐션을 두어,

기본적으로 Gson을 사용 하다가도 상속타입 리스트 전환을 위해 생성한 Gson을 넣어줄 수 있게 사용하는 예제가 포함되있다.

 

 

 

코틀린 변환 과정 :

RuntimeTypeAdapterFactory 생성시에 상위클래스 타입 추가인자에 ("type")값을 하위클래스 타입 추가인자에 ("cat","dog")값을 넣어줘야 한다.

 

 

 

자바 변환 과정 :

코틀린과 마찬가지로, RuntimeTypeAdapterFactory 생성시에 상위클래스 타입 추가인자에 ("type")값을 하위클래스 타입 추가인자에 ("cat","dog")값을 넣어줘야 한다.

 

 

 

결과는 다음과 같다 (java,kotlin 동일)

 

결과를 보면 [ Json화 → 객체화 ] 하는 과정에서 key값이 누락되는것을 알 수 있고 객체화 된걸로 Json화 하면 오류가 발생하기 때문에 객체화 한것을 바로 Json화 하여 사용 할 경우 추가적인 처리가 필요하다.

 

 

 

 

[참조]
github.com/google/gson/blob/master/extras/src/main/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactory.java

jansipke.nl/serialize-and-deserialize-a-list-of-polymorphic-objects-with-gson/

 

Comments