導入
roadmap.shのFlutterのCore Librariesの4本目はdart:convertです。
これはJSON形式の変換やUTF-8の変換などに利用されるライブラリです。
dart:convert
dart:convert
ライブラリは、JSONやUTF-8の変換機能を提供しており、さらに追加のコンバータを作成するための機能も有しています。
このライブラリを使用するには、dart:math
と同様に、dart:convert
をインポートが必要になります。
import 'dart:convert';
JSONのデコードとエンコード
jsonDecode()
を使って、JSON形式の文字列をDartオブジェクトにデコードできます。
// JSON文字列内ではダブルクォート(")を使用し、シングルクォート(')は使用してはいけません。
// また、この文字列はJSON形式であり、Dartオブジェクトではありません。
var jsonString = '''
[
{"score": 40},
{"score": 80}
]
''';
// JSON文字列をDartオブジェクトに変換します。
var scores = jsonDecode(jsonString);
assert(scores is List); // List型になったことの確認
var firstScore = scores[0];
assert(firstScore is Map);
assert(firstScore['score'] == 40);
逆にjsonEncode()
を使うことで、DartオブジェクトをJSON形式の文字列にエンコードできます。
var scores = [
{'score': 40},
{'score': 80},
{'score': 100, 'overtime': true, 'special_guest': null}
];
var jsonText = jsonEncode(scores);
assert(jsonText ==
'[{"score":40},{"score":80},'
'{"score":100,"overtime":true,'
'"special_guest":null}]');
直接JSONにエンコードできるのは、以下の型になります。
int
double
String
bool
null
List
-
Map
(文字列キーを持つもの)
この中でも、List
やMap
オブジェクトは再帰的にエンコードされます。
つまりList
やMap
の中身も同時にエンコードされることになります。
直接エンコードできないオブジェクトをエンコードする方法
以下の2通りがあります。
-
jsonEncode()
に2つ目の引数として、直接エンコード可能なオブジェクトを返す関数を渡す。 - 2つ目の引数を省略することで、エンコーダがオブジェクトの
toJson()
メソッドを呼び出す。
UTF-8文字のデコードとエンコード
utf8.decode()
を使って、UTF-8エンコードされたバイト列をDartの文字列にデコードできます。
List<int> utf8Bytes = [
0xc3, 0x8e, 0xc3, 0xb1, 0xc5, 0xa3, 0xc3, 0xa9,
0x72, 0xc3, 0xb1, 0xc3, 0xa5, 0xc5, 0xa3, 0xc3,
0xae, 0xc3, 0xb6, 0xc3, 0xb1, 0xc3, 0xa5, 0xc4,
0xbc, 0xc3, 0xae, 0xc5, 0xbe, 0xc3, 0xa5, 0xc5,
0xa3, 0xc3, 0xae, 0xe1, 0xbb, 0x9d, 0xc3, 0xb1
];
var funnyWord = utf8.decode(utf8Bytes);
assert(funnyWord == 'Îñţérñåţîöñåļîžåţîờñ');
UTF-8文字のストリームをDartの文字列に変換するには、Stream
のtransform()
メソッドにutf8.decoder
を指定します。
var lines = utf8.decoder.bind(inputStream).transform(const LineSplitter());
try {
await for (final line in lines) {
print('Got ${line.length} characters from stream');
}
print('file is now closed');
} catch (e) {
print(e);
}
JSONと同様に、逆にutf8.encode()
を使用して、Dartの文字列をUTF-8エンコードされたバイト列にエンコードすることもできます。
Uint8List encoded = utf8.encode('Îñţérñåţîöñåļîžåţîờñ');
assert(encoded.length == utf8Bytes.length);
for (int i = 0; i < encoded.length; i++) {
assert(encoded[i] == utf8Bytes[i]);
}
終わりに
今回はさらっとでしたが、dart:convertライブラリについて触れました。
正直、UTF-8の変換を行う機会が今までなく、今後もあまりないかもしれませんが、一方でJSONはAPIとのやりとりで利用することは頻繁にあると思いますので、自分のために限らず、誰かに有益な情報になれば嬉しいです。