일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- RxJava
- 카드 내역 공유 앱
- todofication
- Quickly
- 특가알람
- compileKotlin FAILED
- 특가촌
- 뷰 상태 저장
- 안드로이드 클린 아키텍쳐
- 카드내역 공유
- moveToState
- Android
- andorid
- 타이머앱
- fragment
- android clean architecture
- java.lang.OutOfMemoryError: Java heap space
- nvidia-docker
- Koin
- recyclerview
- 올인원타이머
- onViewCreated
- 뷰 상태복구
- List
- 대학톡
- 작성
- kotlin
- 안드로이드
- 특가게시판
- RX
- Today
- Total
seoft
[java, kotlin] 상속관계 리스트 json타입, 객체타입 전환 (with gson) 본문
사이드 프로젝트 도중 다형성을 이용해 생성된 리스트를 json을 서버에 주고 받을 상황이 생겼다. 일반적으로 한타입의 List를 json화 해봤었지만 다양한 타입을 json화, 객체화 해올 일이 없어 찾아보면서 한번 정리 해본다.
큰 방향은 하위 객체 json에 type key값을 두고 내부적으로 해당 key값을 통해 타입을 설정하는 것 같다.
이 방식을 통해서 다음 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화 하여 사용 할 경우 추가적인 처리가 필요하다.
jansipke.nl/serialize-and-deserialize-a-list-of-polymorphic-objects-with-gson/
'android' 카테고리의 다른 글
[kotlin/android] 리플랙션을 사용해 KClass로 인스터스 생성하기 (0) | 2020.06.18 |
---|---|
LiveDataUtil : LiveData 리스트 형식 관리 (0) | 2020.05.16 |
Retrofit으로 Body 비어있는 Response 받기 (0) | 2020.04.23 |
list의 아이템 중 set의 아이템이 1개이상 포함되는지 여부 체크(kotlin) (0) | 2020.04.07 |
Date 차이에 따른 String 출력(지금 막, n초 전, n분 전, n시간 전, 어제 등등) (0) | 2020.03.21 |