Dev/Android

Kotlin Gson 활용해서 Json 파싱하는 방법

healthyryu 2022. 7. 28. 09:22

Json 값을 Gson 을 활용하여서 Data 클래스로 변환하는 방법

 

Converting from Data Class to JSON String

var gson = Gson()
var jsonString = gson.toJson(TestModel(1,"Test"))
Assert.assertEquals(jsonString, """{"id":1,"description":"Test"}""")

 

Converting from JSON String to a Data Class

var jsonString = """{"id":1,"description":"Test"}""";
var testModel = gson.fromJson(jsonString, TestModel::class.java)
Assert.assertEquals(testModel.id, 1)
Assert.assertEquals(testModel.description, "Test")

참고 : https://www.baeldung.com/kotlin/json-convert-data-class

 

일반적으로 정해진 형태의 오브젝트를 파싱하는 방법은 위와같이 변환하면 된다. 그러나 Object<T> 와 같이 제너릭 형태의 오브젝트를 변환하기 위해서는 TypeToken 을 사용해서 변환해야 합니다.

 

저와 같은 경우는 Retrofit 에서 받는 데이터를 Result<T> 와 같은 형태로 데이터를 받아서 처리하고 있기에 해당 형태로 UnitTest 를 작성하기 위해서 Result<T> 형태의 Json 데이터를 Result<T> 로 변형해줘야 했습니다.

 

내려받는 Json 데이터 형태

{
  "status": 200,
  "data": {
    "name": "프로젝트",
    "term": {
      "start": "2022-01-01",
      "end": "2023-01-01"
    },
    "code": "코드001",
    "purpose": "프로젝트 목적",
    "location": {
      "lat": "...",
      "lang": "...",
      "address": "...",
      "name": "..."
    }
  }
}

Json -> Result<T>

// Mocking json 데이터
val successResponse = MockResponseFileReader("project/success.json")

val listType = object : TypeToken<Result<Project>>() {}.type
val expectedResult = gson.fromJson<Result<Project>>(
    successResponse.content,
    listType
)

val data = expectedResult.data

...
반응형