<aside> 💡 플러터는 GSON, Jackson, Moshi, Dartson 같은 런타임 리플렉션을 사용하는 JSON 직렬화 라이브러리들을 트리 셰이킹을 방해한다는 이유로 지원하지 않고 있다.

</aside>

JSON과 직렬화

Top Flutter Code Generator, JSON Serialization, Annotation packages | Flutter Gems

json_serializable 라이브러리 사이트(fromJson, toJson 등 json ↔ dto 변환을 담당하는 라이브러리)

json_serializable | Dart package

equatable 라이브러리 사이트 (build_runner 없이 hashCode, ==, toString을 정의할 수 있는 라이브러리, 불변성을 제공하지 않으므로 모든 변수는 final 이여야 함)

equatable | Dart package

freezed 라이브러리 사이트(hashCode, ==, toString, copyWith을 불변성과 함께 제공하는 라이브러리)

freezed | Dart Package

dart pub add freezed_annotation json_annotation; dart pub add -d build_runner freezed json_serializable

built_value 라이브러리 사이트(hashCode, ==, toString이 자동으로 구현되는 커스텀 클래스를 불변성과 함께 제공해주는 라이브러리)

Builder 패턴을 사용하여 구현된 것이 특징이다.

abstract class Node implements Built<Node, NodeBuilder> {
  @nullable
  String get label;
  @nullable
  Node get left; 
  @nullable
  Node get right;
  Node._();
  factory Node([updates(NodeBuilder b)]) = _$Node;
}

var node = new Node((b) => b
  ..left.left.left.right.left.right.label = 'I’m a leaf!'
  ..left.left.right.right.label = 'I’m also a leaf!');
var updatedNode = node.rebuild((b) => b
  ..left.left.right.right.label = 'I’m not a leaf any more!'
  ..left.left.right.right.right.label = 'I’m the leaf now!');

built_value | Dart package