snake case value를 camel case로 JSON 직렬화하기 with freezed

Kim Gaeun·2023년 1월 19일
0

Flutter

목록 보기
1/5
post-thumbnail

Dart에서는 기본적으로 Camel Case를 사용하는데, 서버에 따라서 Snake Case를 직렬화해야하는 경우가 있다.

1. key가 snake case인 경우 : @JsonKey

예를 들어, 서버가 파이썬을 사용한다면 다음과 같이 json데이터가 들어올 것이다.

"user_id" : 613,
"user_name" : "I'm user",

Flutter에서는 freezedjson_serializable과 같은 패키지를 사용해서 json데이터를 dart객체로 직렬화하게 되는데, freezed를 기준으로 설명하면 다음과 같이 @JsonKey를 사용해 key값의 snake case를 camel case로 변환할 수 있다.

@freezed
class User with _$User {
  const factory User({
    @JsonKey(name: 'user_id') required int userId,
    @JsonKey(name: 'user_name') required String userName,
  }) = _User;

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}

2. value가 snake case인 경우 : @JsonValue

그렇다면 value가 snake case라면 어떻게 변환해야할까?

위에 예시로 든 json 데이터에 다음과 같은 데이터가 추가되었다.

"user_type" : "admin_a",

이런 경우에는 @JsonValue를 사용할 수 있다.

예를 들어, user_type을 enum class로 사용하고 있다면 다음과 같이 맵핑되는 snake case값을 명시하면 된다.

enum UserType {
	@JsonValue('admin_a')
    adminA,
    @JsonValue('admin_b')
    adminB;
    
    const UserType();

enum으로 처리할 수 있는 경우처럼 snake case의 value가 예측할 수 있는 값이라면 이렇게 @JsonValue를 사용하면 되고 그 외 경우라면 @JsonKey(fromJson: )을 사용해서 값을 camel case로 변환하는 function을 넣어주면 될 것 같다.
(그렇지만 snake case로 넘어온다는 것 자체가 서버 코드 안에서 어떤 타입으로 정의되어 있는 경우일 것 같아서 일반적인 경우는 아닐 것 같다.)

profile
Flutter로 앱개발하고 있어요! iOS도 공부하고 있습니다.

0개의 댓글