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
}