[ 안드로이드 ] Kotlin-Serialization 옵션 정리

 

1. ignoreUnknownKeys

ignoreUnknownKeys = true

JSON 데이터를 역직렬화할 때, 데이터 클래스에 정의되지 않은 추가 필드(알 수 없는 키)가 JSON에 포함되어 있을 경우, 이 필드를 무시하고 나머지 필드만 역직렬화

 

기본값 : false

사용 예시 : 서버에서 제공하는 응답에 예상하지 못한 키가 포함되어 있어도 문제없이 데이터를 파싱하고 싶을 때 사용

@Serializable
data class User(val id: Int, val name: String)

val jsonString = """{"id": 1, "name": "John", "extraField": "unknown"}"""

// ignoreUnknownKeys가 true일 때, "extraField"는 무시되고 정상적으로 역직렬화됨
val user = Json { ignoreUnknownKeys = true }.decodeFromString<User>(jsonString)

 


 

2. prettyPrint

prettyPrint = true

데이터를 직렬화할 때 JSON을 보기 좋게 들여쓰기를 포함하여 출력

개발 및 디버깅 시 가독성을 높이는 데 도움됨

 

기본값 : false

val user = User(id = 1, name = "John")
val jsonString = Json { prettyPrint = true }.encodeToString(user)

// 출력
{
    "id": 1,
    "name": "John"
}

 


 

3. isLenient

isLenient = true

JSON의 문법을 덜 엄격하게 허용하는 옵션

일반적으로 JSON 스펙에 맞지 않는, 더 느슨한 JSON 형식을 허용

 

예를 들어, 문자열을 작은따옴표(')로 묶거나, 키나 값에 따옴표가 없는 경우, 끝에 쉼표가 있어도 허용됨

 

 

기본값 : false

사용 예시 : JSON 데이터가 정확한 표준을 따르지 않을 경우에도 데이터를 파싱하기 위해 사용

val jsonString = """{ id: 1, name: 'John' }"""  // 스펙에 맞지 않음

// isLenient가 true이면, 스펙에 맞지 않는 JSON도 파싱 가능
val user = Json { isLenient = true }.decodeFromString<User>(jsonString)

 


 

4. encodeDefaults

encodeDefaults = true

 

데이터 클래스를 직렬화할 때 기본값을 가진 필드도 JSON으로 직렬화할지 결정하는 옵션

기본적으로 설정된 값이 있을 경우, 그 값을 포함할지 여부를 지정

 

기본값 : true (기본 값을 포함해서 직렬화)

사용 예시 : 기본값을 가진 필드가 JSON에 포함될 필요가 없거나, 직렬화된 데이터 크기를 줄이고 싶을 때 사용

@Serializable
data class User(val id: Int, val name: String = "Unknown")

val user = User(id = 1)

// 기본값을 직렬화하지 않도록 설정 (name은 직렬화되지 않음)
val jsonString = Json { encodeDefaults = false }.encodeToString(user)
// 결과: {"id": 1}

 


 

5. explicitNulls

explicitNulls = false

null 값을 명시적으로 직렬화할지 여부를 결정

이 옵션이 false일 경우, null 값은 JSON에서 생략됨

 

기본값 : true (기본적으로 null을 명시적으로 직렬화)

사용 예시 : 데이터에서 null 값을 명시적으로 직렬화할 필요가 없을 때 사용하여 JSON 크기를 줄일 수 있음

@Serializable
data class User(val id: Int, val nickname: String? = null)

val user = User(id = 1)

// explicitNulls = false일 경우 null 값은 직렬화되지 않음
val jsonString = Json { explicitNulls = false }.encodeToString(user)
// 결과: {"id": 1}

 


 

6. coerceInputValues

coerceInputValues = true

 

예상되는 값과 맞지 않는 값이 입력될 때 자동으로 기본값을 적용하는 옵션

예를 들어, 숫자형 필드에 null이 들어오면 해당 필드에 기본값을 적용

 

기본값 : false

사용 예시 : 예상치 못한 데이터 형식이나 누락된 데이터가 있을 때 강제로 기본값을 적용하여 데이터 불일치를 처리하고 싶을 때 사용

@Serializable
data class User(val age: Int = 0)

val jsonString = """{"age": null}"""

// coerceInputValues = true이면 null 값을 기본값 0으로 대체
val user = Json { coerceInputValues = true }.decodeFromString<User>(jsonString)