「Flutter/外部ライブラリ/json」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→サンプル) |
|||
(同じ利用者による、間の8版が非表示) | |||
行15: | 行15: | ||
==サンプル== | ==サンプル== | ||
− | lib/home/ | + | lib/home/init/user.dart |
<pre> | <pre> | ||
import 'package:json_annotation/json_annotation.dart'; | import 'package:json_annotation/json_annotation.dart'; | ||
行31: | 行31: | ||
以下を実行しuser.g.dartファイルを作成 | 以下を実行しuser.g.dartファイルを作成 | ||
$ flutter packages pub run build_runner build | $ flutter packages pub run build_runner build | ||
+ | |||
+ | 以下ファイルが作成されていることを確認 | ||
+ | |||
+ | lib/home/init/user.g.dart | ||
+ | <pre> | ||
+ | part of 'user.dart'; | ||
+ | User _$UserFromJson(Map<String, dynamic> json) { | ||
+ | return User(json['name'] as String, json['age'] as int); | ||
+ | } | ||
+ | Map<String, dynamic> _$UserToJson(User instance) => | ||
+ | <String, dynamic>{'name': instance.name, 'age': instance.age}; | ||
+ | </pre> | ||
+ | |||
+ | lib/main.dart | ||
+ | <pre> | ||
+ | import 'package:memotyou/home/init/user.dart'; | ||
+ | import 'dart:convert'; | ||
+ | String strJson = '{"name":"taro","age":11}'; | ||
+ | print('json: $strJson'); | ||
+ | dynamic mapUser = json.decode(strJson); | ||
+ | User user = User.fromJson(mapUser); | ||
+ | print('name: ${user.name}, age: ${user.age}'); | ||
+ | String serializedJson = json.encode(user.toJson()); | ||
+ | print('json: $serializedJson'); | ||
+ | </pre> | ||
+ | |||
+ | ==json.decodeが使えない場合== | ||
+ | *import 'dart:convert';されてるか確認 | ||
+ | *strJsonの部分をjsonのstringとして定義していたら、別の変数名に変える | ||
+ | ==response.bodyのjsonをパースする方法== | ||
+ | <pre> | ||
+ | サンプルjson | ||
+ | {"code":200,"message":"ok","body":[{"id":1,"name":"taro"},{"id":2,"name":"jiro"}]} | ||
+ | |||
+ | // jsonのdecode | ||
+ | final responseJson = json.decode(response.body); | ||
+ | List<dynamic> userList = responseJson["body"]; | ||
+ | for (Map<String, dynamic> user in userList) { | ||
+ | print(user.id); // 1, 2 | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | 参考:https://stackoverflow.com/questions/53517643/flutter-json-decode-return-incorrect-json | ||
+ | |||
+ | ==参考== | ||
+ | https://qiita.com/rkowase/items/f397513f2149a41b6dd2 | ||
+ | |||
+ | http://ryuichi111std.hatenablog.com/entry/2018/11/01/035333 |
2019年12月12日 (木) 18:40時点における最新版
準備
jsonパッケージインストール
pubspec.yaml
dependencies: json_annotation: ^2.0.0 dev_dependencies: build_runner: ^1.0.0 json_serializable: ^2.0.0
$ flutter package get
を実行
サンプル
lib/home/init/user.dart
import 'package:json_annotation/json_annotation.dart'; part 'user.g.dart'; @JsonSerializable() class User { User(this.name, this.age); String name; int age; factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json); Map<String, dynamic> toJson() => _$UserToJson(this); }
以下を実行しuser.g.dartファイルを作成
$ flutter packages pub run build_runner build
以下ファイルが作成されていることを確認
lib/home/init/user.g.dart
part of 'user.dart'; User _$UserFromJson(Map<String, dynamic> json) { return User(json['name'] as String, json['age'] as int); } Map<String, dynamic> _$UserToJson(User instance) => <String, dynamic>{'name': instance.name, 'age': instance.age};
lib/main.dart
import 'package:memotyou/home/init/user.dart'; import 'dart:convert'; String strJson = '{"name":"taro","age":11}'; print('json: $strJson'); dynamic mapUser = json.decode(strJson); User user = User.fromJson(mapUser); print('name: ${user.name}, age: ${user.age}'); String serializedJson = json.encode(user.toJson()); print('json: $serializedJson');
json.decodeが使えない場合
- import 'dart:convert';されてるか確認
- strJsonの部分をjsonのstringとして定義していたら、別の変数名に変える
response.bodyのjsonをパースする方法
サンプルjson {"code":200,"message":"ok","body":[{"id":1,"name":"taro"},{"id":2,"name":"jiro"}]} // jsonのdecode final responseJson = json.decode(response.body); List<dynamic> userList = responseJson["body"]; for (Map<String, dynamic> user in userList) { print(user.id); // 1, 2 }
参考:https://stackoverflow.com/questions/53517643/flutter-json-decode-return-incorrect-json