【Dart】JSON(文字列)をオブジェクトに変換

DartでJSON(文字列)をオブジェクトに変換する方法についてソースコード付きでまとめました。

## 【Dart】JSON(文字列) -> オブジェクト

dart:convertに含まれるJsonCodecクラスのdecodeメソッドを使って、JSON文字列からオブジェクトへ変換します。

## 【サンプルコード】Dart

サンプルプログラムのソースコードです。

import 'dart:convert';

void main() {
  String stringData  = "Excalibur";
  int    intData  = 114514;
  List   listData = ["Saver", 123, "Excalibur", 456];
  Map    mapData  = {"Saver":"Altria", "List":["x", 10], "Map":{"key":"value"}};

  // オブジェクト(String, Int, List, Map)をJSON文字列(String)へ変換
  String stringJsonData = json.encode(stringData);
  String intJsonData = json.encode(intData);
  String listJsonData = json.encode(listData);
  String mapJsonData = json.encode(mapData);

  // JSON文字列を表示
  print( stringJsonData ); // "Excalibur"
  print( intJsonData );    // 114514
  print( listJsonData );   // ["Saver",123,"Excalibur",456]
  print( mapJsonData );    // {"Saver":"Altria","List":["x",10],"Map":{"key":"value"}}

  // JSON文字列(String)を オブジェクト(String, Int, List, Map)に変換
  String stringData2  = json.decode(stringJsonData);
  int intData2  = json.decode(intJsonData);
  List   listData2 = json.decode(listJsonData);
  Map    mapData2  = json.decode(mapJsonData);

  // デコードで復元したオブジェクトを表示
  print( stringData2 ); // Excalibur
  print( intData2 );    // 114514
  print( listData2 );   // [Saver, 123, Excalibur, 456]
  print( mapData2 );    // {Saver: Altria, List: [x, 10], Map: {key: value}}
}

decodeメソッドはJSON文字列に応じた型を返します。

## 【注意】Map型のオブジェクトをJSON文字列へ変換する際の制約

Map型をJSON文字列へ変換するには、キーがString型である必要があります。
つまり、キーをObject型やint型などにすると変換できず、エラーが出ます。

import 'dart:convert';

void main() {
  // キーがString型ならOK
  Map mapData1 = {"key1": "value", "key2": 123};
  String mapJsonData1 = json.encode(mapData1);
  print(mapJsonData1); // {"key1":"value","key2":123}

  // キーがString型ならError
  Map mapData2 = {10: "value1", 20: "value2"};
  String mapJsonData2 = json.encode(mapData2);
  print(mapJsonData2);
/*
Unhandled exception:
Converting object to an encodable object failed: _LinkedHashMap len:2
#0      _JsonStringifier.writeObject (dart:convert/json.dart:647:7)
#1      _JsonStringStringifier.printOn (dart:convert/json.dart:834:17)
#2      _JsonStringStringifier.stringify (dart:convert/json.dart:819:5)
#3      JsonEncoder.convert (dart:convert/json.dart:255:30)
#4      JsonCodec.encode (dart:convert/json.dart:166:45)
#5      main (file:///C:/prog/flutter/a/test.dart:11:30)
#6      _startIsolate. (dart:isolate-patch/isolate_patch.dart:301:19)
#7      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:172:12)
*/
}
関連記事
1 【Flutter入門】iOS、Android、Windowsアプリ開発
2 【Dart入門】基礎文法とサンプルコード集
Dart
スポンサーリンク

コメント