0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Roadmap.shで学ぶFlutter - Advanced Dart - [Core Libraries④:convert]

Posted at

導入

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(文字列キーを持つもの)

この中でも、ListMapオブジェクトは再帰的にエンコードされます。
つまりListMapの中身も同時にエンコードされることになります。

直接エンコードできないオブジェクトをエンコードする方法

以下の2通りがあります。

  1. jsonEncode()に2つ目の引数として、直接エンコード可能なオブジェクトを返す関数を渡す。
  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の文字列に変換するには、Streamtransform()メソッドに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とのやりとりで利用することは頻繁にあると思いますので、自分のために限らず、誰かに有益な情報になれば嬉しいです。

0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?