JSON을 Dart 클래스로 변환(Flutter)
JSON을 fromJson/toJson이 있는 널 안전 Dart 모델 클래스로 바꾸거나 json_serializable 어노테이션을 만듭니다. 중첩 클래스와 목록도 지원합니다.
모든 샘플이 null이거나 샘플마다 값의 종류가 달라서 dynamic을 썼습니다. 실제 타입을 알게 되면 바꾸세요.
10.0처럼 쓴 숫자는 정수로 읽히므로, 샘플이 모두 그런 필드는 int가 됩니다. double이 필요하면 소수가 있는 샘플을 하나 넣으세요.
Flutter 앱은 JSON을 Dart 모델 클래스로 해독하는데, 필드, 생성자, fromJson, toJson을 손으로 쓰는 일은 느리고 실수하기 쉽습니다. API 응답 샘플을 붙여 넣으면 널 안전 Dart 클래스를 얻습니다. 중첩된 객체는 각각 클래스가 되고, 배열은 List<T>가 되며, 일부 샘플에서 null이거나 빠진 필드는 null 허용(T?)이 되고, snake_case 키는 camelCase 필드가 되면서도 올바른 JSON 키를 읽습니다. 패키지 없는 직접 작성 fromJson/toJson이나 코드 생성용 json_serializable 어노테이션 중에서 고를 수 있습니다.
사용 방법
- 대표적인 JSON 샘플을 붙여 넣습니다. 항목이 여러 개인 배열이 타입이 가장 정확합니다.
- 루트 클래스 이름을 입력합니다.
- 직접 작성한 fromJson/toJson, json_serializable, 필드만 중에서 고릅니다.
- 필드를 필요할 때만 null 허용으로 할지 항상 그렇게 할지, ISO 날짜 문자열을 DateTime으로 바꿀지 정합니다.
- 코드를 .dart 파일에 복사합니다(json_serializable은 build_runner를 실행).
계산식
정수 → int · 소수 → double · true/false → bool · 텍스트 → String · ISO 날짜 → DateTime · [ … ] → List<T> · { … } → 클래스
같은 위치에서 본 값은 합쳐집니다. int와 double은 double이 되고(num으로 읽으므로 JSON의 1도 형 변환에 실패하지 않음), 종류가 섞이면 dynamic이 됩니다. 일부 샘플에서 null이거나 일부 배열 항목에 없는 필드는 null 허용입니다. 같은 모양의 객체는 클래스 하나를 공유하며, 목록 항목 클래스는 키의 단수형으로 이름을 붙입니다(orders → Order). Dart 키워드나 dart:core 타입과 겹치는 이름에는 접미사가 붙습니다(class → classValue, Map → MapModel).
예시
예제 사용자로 클래스 세 개가 만들어집니다. User에는 final int id, String name, String email, bool isActive(is_active에서), double balance, DateTime createdAt, List<String> tags, Address address, List<Order> orders, 샘플에서 null인 dynamic manager가 있습니다. Order에는 String orderId, double total(59.9와 12가 합쳐져 double), int items, String? coupon이 있으며 쿠폰은 두 번째 주문에만 있어 null 허용입니다. fromJson은 json['order_id']를 읽고, toJson은 createdAt을 toIso8601String()으로 씁니다.
자주 묻는 질문
직접 작성과 json_serializable 중 무엇이 좋나요?
직접 작성한 fromJson/toJson은 패키지도 빌드 단계도 필요 없어 작은 모델에 알맞습니다. json_serializable은 build_runner로 같은 코드를 어노테이션에서 생성하며, 모델이 자주 바뀔 때 유지하기 쉽습니다.
필드의 타입이 dynamic인 이유는 무엇인가요?
모든 샘플이 null이었거나, 숫자와 텍스트처럼 종류가 섞여 있기 때문입니다. 실제 값이 있는 샘플을 붙여 넣거나 타입을 직접 지정하세요.
double 필드가 (json['x'] as num).toDouble()을 쓰는 이유는 무엇인가요?
JSON은 12와 12.0을 구별하지 않아서 jsonDecode가 정수에는 int를 돌려줍니다. 바로 double로 형 변환하면 예외가 나지만, num을 거치면 둘 다 받아들입니다.
내 JSON이 업로드되나요?
아닙니다. 클래스는 브라우저에서 만들어집니다.
출처
최종 업데이트:
이 입력값이 담긴 페이지 주소: https://kakao.mobile/ko/tools/json-to-dart-pojo-generator/
인용·퍼가기
kakaoCalc. (2026, November 8). JSON을 Dart 클래스로 변환(Flutter). https://kakao.mobile/ko/tools/json-to-dart-pojo-generator/
“JSON을 Dart 클래스로 변환(Flutter).” kakaoCalc, 8 Nov. 2026, kakao.mobile/ko/tools/json-to-dart-pojo-generator/.