Dart에서는 기본적으로 Camel Case를 사용하는데, 서버에 따라서 Snake Case를 직렬화해야하는 경우가 있다.
예를 들어, 서버가 파이썬을 사용한다면 다음과 같이 json데이터가 들어올 것이다.
"user_id" : 613,
"user_name" : "I'm user",
Flutter에서는 freezed
나 json_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);
}
그렇다면 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로 넘어온다는 것 자체가 서버 코드 안에서 어떤 타입으로 정의되어 있는 경우일 것 같아서 일반적인 경우는 아닐 것 같다.)