본문으로 바로가기

다트(dart) JSON 사용하기

category Language/Dart 2020. 8. 19. 22:30

dart:convert

  • JSON 및 UTF-8 을 포함한 다양한 데이터 표현간 변환을 위한 인코더 및 디코더를 지원하는 라이브러리이다.

 

예제1

 

기본적인 JSON 문자열을 파싱하고 접근하는 방법에 대한 예제입니다.

 

JSON 문자열을 파싱하기 위해서는 jsonDecode() 함수를 사용하며 Map 객체로 변환합니다.

import 'dart:convert';

void main(){
  String jsonString = '{"name": "red"}';
  String jsonString2 = '{"name": ["red", "green", "blue"]}';
  
  Map<String, dynamic> color = jsonDecode(jsonString);
  Map<String, dynamic> color2 = jsonDecode(jsonString2);

  print(color);
  print(color2);
  
  print('${color['name']}');
  print('${color2['name']}');
}
{name: red}
{name: [red, green, blue]}
red
[red, green, blue]

 

 

예제2

 

다음은 데이터 모델 클래스 이용하여 JSON 으로 직렬화를 알아보겠습니다.

 

이 방법을 사용하면, 변수에 대한 타입 안정성, 자동완성, 컴파일 타임 예외처리가 가능하구요.

복잡하게 중첩되지않은 JSON 형식에 대한 인코딩, 디코딩에 유리합니다.

 

color.dart

class Color {
  final int id;
  final String name;
  final String rgb;

  Color(this.id, this.name, this.rgb);

  Color.fromJson(Map<String, dynamic> json)
    : id = json['id'],
      name = json['name'],
      rgb = json['rgb'];

  Map<String, dynamic> ToJson() =>
  {
    'id': id,
    'name': name,
    'rgb': rgb
  };
}

 

main.dart

import 'dart:convert';
import 'color.dart';

void main(){
  // 1
  var blue = Color(1, 'blue', '0, 0, 255');
  var toJson = blue.ToJson();
  print('${toJson['id']}');
  print('${toJson['name']}');
  print('${toJson['rgb']}');
  String jsonString2 = jsonEncode(toJson);
  print(jsonString2);
  
  // 2
  String jsonString = '{"id": 2, "name": "blue", "rgb": "0, 0, 255"}';
  Map colorMap = jsonDecode(jsonString);
  var color = Color.fromJson(colorMap);
  print(color.id);
  print(color.name);
  print(color.rgb);
  
  // 3
  String jsonString = '[{"id": 1, "name": "red", "rgb": "255, 0, 0"}, {"id": 2, "name": "green", "rgb": "0, 255, 0"}, {"id": 3, "name": "blue", "rgb": "0, 0, 255"}]';
  List list = jsonDecode(jsonString);
  for(var color in list){
    print("${color['id']} ${color['name']} ${color['rgb']}");
  }
  var colorList = list.map((element) => Color.fromJson(element)).toList();
  for(var color in colorList){
    print('${color.id} ${color.name} ${color.rgb}');
  }
}

 

 

우선 JSON 문자열로 인코딩하기 위해서는 클래스 객체를 생성해서 클래스의 ToJson 메서드를 이용하여 Map 객체를 생성합니다.

var blue = Color(1, 'blue', '0, 0, 255');
var toJson = blue.ToJson();
print('${toJson['id']}');
print('${toJson['name']}');
print('${toJson['rgb']}');
1
blue
0, 0, 255

 

jsonEncode() 함수를 이용하여 JSON 문자열로 변환합니다.

String jsonString2 = jsonEncode(toJson);
print(jsonString2);
{"id":1,"name":"blue","rgb":"0, 0, 255"}

 

 

반대의 경우에는 jsonDecode() 함수를 이용하여 JSON 문자열을 Map 객체로 변환하고

클래스에서 작성한 fromJson() 메서드를 통해 객체로 변환하여 접근합니다.

String JsonString = '{"id": 2, "name": "blue", "rgb": "0, 0, 255"}';
Map colorMap = jsonDecode(JsonString);
var color = Color.fromJson(colorMap);
print(color.id);
print(color.name);
print(color.rgb);

 

 

JSON Array 의 처리는 다음과 같습니다.

String jsonString = '[{"id": 1, "name": "red", "rgb": "255, 0, 0"}, {"id": 2, "name": "green", "rgb": "0, 255, 0"}, {"id": 3, "name": "blue", "rgb": "0, 0, 255"}]';
List list = jsonDecode(jsonString);
for(var color in list){
  print("${color['id']} ${color['name']} ${color['rgb']}");
}
var colorList = list.map((element) => Color.fromJson(element)).toList();
for(var color in colorList){
  print('${color.id} ${color.name} ${color.rgb}');
}
1 red 255, 0, 0
2 green 0, 255, 0
3 blue 0, 0, 255
1 red 255, 0, 0
2 green 0, 255, 0
3 blue 0, 0, 255

 

 

참고

 

JSON과 직렬화

어느 시점부터 웹 서버와 통신하지 않거나 구조화된 데이터를 적절하게 보관하지 않는 모바일 앱을생각하기 어려워졌습니다. 네트워크와 연결된 앱을 제작할 때, 결국에는 제법 괜찮은 JSON을사

flutter-ko.dev