Dart 언어를 사용하는 flutter 어플리케이션Java를 사용하는 웹페이지, Python을 사용하는 서버 등을 연결하는 경우, 사용하는 언어가 다르기 때문에 각자가 사용하는 데이터의 형식을 읽어올 수 없음

이 때 사용하는 것이 JSON이다.

 

다트 객체를 JSON 형식으로, 또는 반대로 변환할 때는 직렬화/역직렬화를 거친다.

 

직렬화 : Dart 객체 -> Map -> String
역직렬화 : String -> Map -> Dart 객체

 

왜 Map을 거치는가? 

객체를 바로 String으로 바꾸려면 직접 구현 필요 < 복잡하고 어려움, 번거로움

Dart sdk의 dart:convert 라이브러리의 jsonEncode, jsonDecode를 사용하는 방식이 편리하고, 이 함수들은 Map을 사용하기 때문!

 

jsonEncode 

jsonEncode: Dart 기본 타입(Map, List, int, null, bool 등)JSON String 으로 변환하는 함수

 

문법

String jsonEncode(Object? object)
// object에는 Map, List, int, String 과 같은 다트 기본 자료형만 넣을 수 있음
// 반환 타입 : JSON String

예시

Map<String, dynamic> map = {
	"name": "Harry", 
	"age": 17
};

String jsonData = jsonEncode(map);

print(jsonData);

// {"name":"Harry","age":17}

 

jsonDecode 

jsonDecode: JSON StringDart 구조체 타입(Map, List 등)으로 변환하는 함수

 

문법

dynamic jsonDecode(String source)
// source는 JSON String 타입만 가능
// 반환 타입은 Map<String, dynamic> 또는 List<Dynamic>

예시

String jsonSampleData = """
{
  "name":"Harry",
  "age":17
}
""";

var decodedData = jsonDecode(jsonSampleData);
print(decodedData.runtimeType);		// _Map<String,dynamic>
print(decodedData);		// {name: Harry, age: 17}

 

 

객체에서 jsonEncodejsonDecode 사용하기

Map<String, dynamic> map = {"name": "Harry", "age": 17};

class Human {
  String name;
  int age;

  Human({
  required this.name, 
  required this.age
  });
  
  Human.fromJson(Map<String, dynamic> map)
    : this(name: map['name'], age: map['age']);

  Map<String, dynamic> toJson() {
    return {'name': name, 'age': age};
  }
}

 

1. class Human은 String 타입의 name, int 타입의 age 를 가진다.

2. name, age 는 non - nullable 타입으로, 반드시 값이 필요하기 때문에 required 키워드를 사용해 값을 주고 넘어간다.

3. Human.fromJson 함수로 map에서 'name', 'age'의 키 값을 가져와 Human 객체의 name, age에 설정한다.

4. toJson 함수로 Human 객체의 name, age를 값으로 가지는 Map을 생성한다.

 

 

여기서 fromJson, toJson 함수는 앞서 설명한 jsonEncode, jsonDecode와 비슷한 역할을 하지만, 약간의 차이점이 있다.

 

jsonEncode, jsonDecode : Map, List 같은 기본 자료형에 사용

fromJson, toJson : 클래스(객체)를 Map처럼 변환하거나, Map에서 객체를 만들 때 사용

 

 

또한, 1, 2, 3은 Human을 만들고 적절한 값을 부여하기 위해 필수적인 과정이지만, 4번은 그렇지 않다. 

결과만 놓고 본다면 4번 코드를 아예 삭제해도 class Human은 정상적으로 구현된다.

하지만 프로그램 확장성을 위해 언제든 객체를 Json으로 사용할 준비를 해 두는 것이 실제 개발에서는 필수적이다.

 

 

 

+ Recent posts