【Flutter】ModelのJson変換あれこれ(Dart)

Flutter
Ian Hickson (@Hixie) / X
スポンサーリンク

JsonにEncode、Decodeする方法

以下のように書けば基本的にJsonのパースが行える。

ただし自作クラスなどは追加の処理が必要。

import 'dart:convert';

// Jsonの文字列に変換するとき
String jsonText = jsonEncode(Jsonに変換したいものを追加)

// Json文字列からデコードするとき
Map<String,Dynamic> jsonRow = jsonDecode(Jsonのテキストを追加)

自作クラスをJsonにパースするとき

そのままだとエラーが発生する。

自作クラスに toJson() メソッドを追加することで解決する。

逆にModelに変換するときのメソッドは無いので自分で用意する必要がある。

以下のモデルクラスがあるとする。

class DataRoot
{
  late int val1 = 10;
  late List<int> val2 = [1,2,3];
  late List<Model> val3 = [Model(), Model()];
  late DateTime val4 = DateTime.now();
  late TestEnum val5 = TestEnum.typeB;
}

Jsonに変換する

DataRootクラスに以下のメソッドを追加することでJsonに変換できる

  dynamic toJson() => {
    "val1": val1,
    "val2": val2,
    "val3": val3,
    "val4": val4.toString(),
    "val5": val5.name,
  };

Modelに変換する

DataRootクラスに以下のメソッドを追加することでモデルに変換できる

  DataRoot.fromJson(Map<String, dynamic> jsonRaw) :
    val1 = jsonRaw['val1'],
    val2 = List<int>.from(jsonRaw["val2"]),
    val3 = List<Model>.from(jsonRaw["val3"].map((x) => Model.fromJson(x))),
    val4 = DateTime.parse(jsonRaw['val4']),
    val5 = TestEnum.values.byName(jsonRaw['val5'])
  ;

ちなみに使用方法は以下のように書けばよい

var jsonRow = jsonDecode(jsonText);
var data = DataRoot.fromJson(result);

コード全体

import 'dart:convert';

enum TestEnum
{
  typeA,
  typeB,
  typeC,
}

class Model
{
  late String a = "A";
  late String b = "B";

  Model();
  
  // Jsonに変換
  dynamic toJson() => {"a":a, "b":b};
  
  // Jsonデータから変換
  Model.fromJson(Map<String, dynamic> jsonRaw) :
    a = jsonRaw["a"],
    b = jsonRaw["b"]
  ;
}

class DataRoot
{
  late int val1 = 10;
  late List<int> val2 = [1,2,3];
  late List<Model> val3 = [Model(), Model()];
  late DateTime val4 = DateTime.now();
  late TestEnum val5 = TestEnum.typeB;

  DataRoot();

  // Jsonに変換
  dynamic toJson() => {
    "val1": val1,
    "val2": val2,
    "val3": val3,
    "val4": val4.toString(),
    "val5": val5.name,
  };
  
  // Jsonデータから変換
  DataRoot.fromJson(Map<String, dynamic> jsonRaw) :
    val1 = jsonRaw['val1'],
    val2 = List<int>.from(jsonRaw["val2"]),
    val3 = List<Model>.from(jsonRaw["val3"].map((x) => Model.fromJson(x))),
    val4 = DateTime.parse(jsonRaw['val4']),
    val5 = TestEnum.values.byName(jsonRaw['val5'])
  ;
}

void main(){

  // エンコード
  var jsonText = jsonEncode(DataRoot());
  print(jsonText); // {"val1":10,"val2":[1,2,3],"val3":[{"a":"A","b":"B"},{"a":"A","b":"B"}],"val4":"2023-11-19 11:29:39.033","val5":"typeB"}

  // デコード
  var result = jsonDecode(jsonText);
  
  // モデルに変換
  var data = DataRoot.fromJson(result);
  print(data); // Instance of 'DataRoot'
  print(data.val1); // 10
  print(data.val2[1]); // 2
  print(data.val3[0].a); // A
  print(data.val4); // 2023-11-19 11:29:39.033
  print(data.val5); // TestEnum.typeB
}
スポンサーリンク
Flutter
スポンサーリンク
シェアボタン ('ω')ノ
ゲーム開発技術ブログ スメラテ すめらて
タイトルとURLをコピーしました