본문 바로가기
언어/Dart

JSON 다루기

by 개발짜 2024. 12. 2.

JSON(JavaScript Object Notation) 이란

키(key)-속성(value) 값으로 이루어진 데이터 형식(format)으로, 대량의 데이터를 저장하거나 전송할 때 json 형태로 값을 묶어서 전송한다.

 

key 의 타입은 String 만 가능하며

value 의 타입은

- String

- Number(int, double)

- Boolean

- Array

- Object

- null

 

JSON 예시

{
	"name": "멍멍이",
	"age": 2,
	"isMale" : true,
	"favorite_foods" : ["고기", "사료", "고구마"],
	"contact": {
		"mobile": "010-0000-0000",
		"email": null
	}
}

 

Dart 에서 JSON 데이터 변환하는 방법

클래스 구성

// Pet 클래스 구성
class Pet {
  // 필드
  String name;
  int age;
  bool isMale;
  List<String> favoriteFoods;
  Contact contact;

  // 생성자
  Pet({
    required this.name,
    required this.age,
    required this.isMale,
    required this.favoriteFoods,
    required this.contact,
  });
}

// Contact 클래스 구성
class Contact {
  // 필드
  String mobile;
  String? email;

  // 생성자
  Contact({
    required this.mobile,
    required this.email,
  });
}

 

직렬화:

Dart 객체를 JSON 형태의 문자열로 변환하는 것

 

방법

1. Dart 객체를 map 형태로 변환하는 메서드 생성

void main() {
  Contact contact = Contact(mobile: "010-0000-0000", email: null);

  // 객체 생성
  Pet pet = Pet(
      name: '멍멍이',
      age: 2,
      isMale: true,
      favoriteFoods: ["고기", "사료", "고구마"],
      contact: contact);
}

// 객체 클래스 구성
class Pet {
  ...
  // 1. Map 데이터 형식으로 변환하는 메서드 생성
  Map<String, dynamic> toJson() {
    return {
      'name': name,
      'age': age,
      'isMale': isMale,
      'favoriteFoods': favoriteFoods,
      'contact': contact.toJson(),
    };
  }
}

class Contact {
  ...
  // 1. Map 데이터 형식으로 변환하는 메서드 생성
  Contact.fromJson(Map<String, dynamic> map)
    : this(
        mobile: map['mobile'],
        email: map['email'],
      );
}

 

2. 객체를 Map 형식으로 변환

// 2. 객체 -> map 으로 변환
final petToMap = pet.toJson();

 

3. Map 으로 변환된 값을 jsonEncode 를 통해 json 형태로 변환

// 3. map -> json
jsonEncode(petToMap);

 

 

 

역직렬화:

JSON 형태의 문자열을 Dart 객체로 변환하는 것

방법

1. json 형태의 데이터를 jsonDecode 를 통해 Map 형태의 데이터로 변환

void main() {
  final jsonData = """
{
  "name": "멍멍이",
  "age": 2,
  "isMale" : true,
  "favorite_foods" : ["고기", "사료", "고구마"],
  "contact": {
    "mobile": "010-0000-0000",
    "email": null
  }
}
"""
  // 1. json 데이터를 map 으로 변환
  Map<String, dynamic> jsonMap = jsonDecode(jsonData);
}

 

2. Map 데이터를 Dart 객체로 변환하는 네임드 생성자 생성

class Pet {
  ...
  // 2. Map 데이터를 Dart 객체로 변환하는 네임드 생성자 생성
  Pet.fromJson(Map<String, dynamic> map)
      : this(
          name: map['name'],
          age: map['age'],
          isMale: map['isMale'],
          // jsonDecode 하면서 List<dynamic> 타입으로 바뀌기 때문에 <String> 으로 지정해야함
          favoriteFoods: List<String>.from(map['favorite_foods']),
          contact: Contact.fromJson(map['contact']),
        );
}

class Contact {
  ...
  // 2. Map 데이터를 Dart 객체로 변환하는 네임드 생성자 생성
  Contact.fromJson(Map<String, dynamic> map)
      : this(
          mobile: map['mobile'],
          email: map['email'],
        );
        
}

3. Map -> 객체로 변환

// 3. map -> 객체로 변환
jsonDecode(jsonMap);

 

 

요약 정리

직렬화(객체 -> Map -> JSON)

객체 클래스에서 map 으로 변환하는 메서드(toJson) 생성해서 jsonEncode 로 json 변환

역직렬화(JSON -> Map -> 객체)

json 을 jsonDecode 해서 map 형태로 변환하고 해당 데이터 타입을 객체로 변환하는 네임드 생성자(fromJson)로 객체 변환

 

 

'언어 > Dart' 카테고리의 다른 글

[Dart] 자주 사용되는 Collection 타입 데이터 처리 메서드  (0) 2024.10.29
Dart 시작하기!  (0) 2024.10.08

댓글