LoginSignup
0
1

More than 1 year has passed since last update.

Dart JSONでMapをencode/decode

Posted at

はい、今回Freezedとjson_serializableでかなり端折ってしまった部分があったので、Flutterにデフォルトで入っているdart:convertパッケージを利用してJSONを使ってMapを変換する仕組みをまとめてみました。

main.dart
import 'package:flutter/material.dart';
import 'dart:convert' as convert;

void main() {
  final map = {"firstName": "ume", "lastName": "taro", "age": 20};
  
    // まずはMapをJSONの文字列にしてみます(エンコード)
  final json = convert.json.encode(map); 
  print(json); // {"firstName": "ume", "lastName": "taro", "age": 20}

  // つぎにJSON文字列からMapに変換(デコード)
  final mapNew = convert.json.decode(json) as Map<String, dynamic>;
  print(mapNew); // {firstName: ume, lastName: taro, age: 20}

  // Map型をJSON文字列に変換(エンコード) この時、keyの部分は必ずStringにしないとエラーになります。
  final Map<String, dynamic> encodableMap = {
    "firstName": "ume",
    "lastName": "jiro",
    "age": 18
  };
  final String encodedMap = convert.json.encode(encodableMap);
  print(encodedMap); // {"firstName":"ume","lastName":"jiro","age":18}

    // main()の外にPerson(カスタムクラス)を作ってエンコード
  Person p = new Person("ume", "saburo", 16);
  print("Person:${convert.json.encode(p)}"); // Person:{"firstName":"ume","lastName":"saburo","age":16}

  // 変換不可能なオブジェクトが渡されたときの対処
  Object unencodable = new Object();
  try {
    print(convert.json.encode(unencodable, toEncodable: (e) => e.toString()));
  } on convert.JsonUnsupportedObjectError {
    print("Error"); // "Instance of 'Object'"
  }

  runApp(const ProviderScope(
    child: MyApp(),
  ));
}

// カスタムクラスを変換する場合、クラスにtoJsonメソッドを実装
class Person {
  String firstName;
  String lastName;
  int age;
  Person(this.firstName, this.lastName, this.age);

  // toJsonメソッドを使用することでencode時にJSON文字列へ変換可能なMap型オブジェクトを返す
  dynamic toJson() =>
      {"firstName": firstName, "lastName": lastName, "age": age};
}

以上見やすくまとめてみました。main.dartをデバッグしてみるとログがでてきて確認できるかと、スクリーンショット 2022-09-26 15.47.20.png
他にもデコード時の挙動を操作できるパラメータなどもあって、また実装で使うことがあれば記事にしたいと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1