Simple&Natural
[Android] Moshi를 이용하여 JsonObject 형태의 데이터 파싱하기 본문
728x90
newParameterizedType으로 원하는 타입을 Parameter로 포함하는 Type을 만든다.
해당 메소드는 다음과 같이 구현되어 있다.
/**
* Returns a new parameterized type, applying {@code typeArguments} to {@code rawType}. Use this
* method if {@code rawType} is not enclosed in another type.
*/
public static ParameterizedType newParameterizedType(Type rawType, Type... typeArguments) {
if (typeArguments.length == 0) {
throw new IllegalArgumentException("Missing type arguments for " + rawType);
첫 번째 인자는 겉으로 드러나는 형태의 데이터 형식을 말한다.
예를 들어 List<class, class> 라면 List를 의미한다.
JsonObject 형식은 Map<String, String>으로 맵핑되므로 첫 번째 인자로 Map::class.java를 넣어주어야 한다.
그리고 두 번째 부터는 해당 rawType에서 적용되는 인자들을 의미한다.
내 경우 String 두 개를 넣어주어야 한다.
이후 Moshi에서 해당 Parameter를 어떤 식으로 나타낼 건지 컬렉션을 이용해 알려주고 symbolListType을 넘겨주면
우리가 원하는 형태로 파싱할 수 있는 Adapter가 생성된다.
이후 사용하면 됨.
val string = remoteConfig.getString("currency_symbols")
Log.d("MyTag", "총 글자수: ${string.length}")
val symbolListType = Types.newParameterizedType(Map::class.java, String::class.java, String::class.java)
val symbolListAdapter = get(Moshi::class.java).adapter<Map<String, String>>(symbolListType)
val json = symbolListAdapter.fromJson(string)
Log.d("MyTag", "Json: ${json}")
참고자료
Jake Wharton의 답변
github.com/square/moshi/issues/78
728x90