🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

1回答

4115閲覧

Flutter Json変換エラー

ss-nantoka

総合スコア18

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

1クリップ

投稿2019/09/22 11:39

前提・実現したいこと

APIを発行し、Jsonデータを取得後、変換させようとしたところ、エラーが発生しており、どのように修正すれば良いか分からず困っています。

発生している問題・エラーメッセージ

Article article = Article.fromJson(articleMap); print('article: ${article}');

上記の部分が原因により、

[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>'

のエラーメッセージが出力されています。
変換が理由だと思うのですが、よく分かっていません。。

該当のソースコード

main.dart(抜粋)

Dart

1 Future<void> _selectArticleList() async { 2 final response = await http.get("https://qiita.com/api/v2/items", 3 headers: {"Content-Type": "application/json", "Authorization": "Bearer xxxxxxxxxxxxxxxxxxxxxx"}); 4 print("ステータス: ${response.statusCode}"); 5 print("中身: ${response.body}"); 6 if (response.statusCode == 200) { 7 final articleMap = json.decode(response.body); 8 print('articleMap: ${articleMap}'); 9 Article article = Article.fromJson(articleMap); # ここでエラー 10 print('article: ${article}'); 11 } 12 }

article.dart

Dart

1import 'package:json_annotation/json_annotation.dart'; 2 3part 'article.g.dart'; 4 5() 6class Article { 7 (name: 'created_at') 8 final String createdAt; 9 final String id; 10 (name: 'likes_count') 11 final int likesCount; 12 final String title; 13 final String url; 14 15 Article({ 16 this.createdAt, 17 this.id, 18 this.likesCount, 19 this.title, 20 this.url, 21 }); 22 23 factory Article.fromJson(Map<String, dynamic> json) => _$ArticleFromJson(json); 24 25 Map<String, dynamic> toJson() => _$ArticleToJson(this); 26}

article.g.dart

Dart

1// GENERATED CODE - DO NOT MODIFY BY HAND 2 3part of 'article.dart'; 4 5// ************************************************************************** 6// JsonSerializableGenerator 7// ************************************************************************** 8 9Article _$ArticleFromJson(Map<String, dynamic> json) { 10 return Article( 11 createdAt: json['created_at'] as String, 12 id: json['id'] as String, 13 likesCount: json['likes_count'] as int, 14 title: json['title'] as String, 15 url: json['url'] as String, 16 ); 17} 18 19Map<String, dynamic> _$ArticleToJson(Article instance) => <String, dynamic>{ 20 'created_at': instance.createdAt, 21 'id': instance.id, 22 'likes_count': instance.likesCount, 23 'title': instance.title, 24 'url': instance.url, 25 };

対象のJsonレスポンス

json

1[ 2 { 3 "rendered_body": "\n\u003ch1\u003e\n\u003cspan id=\"qiitateamの運用方法を考える\" class=\"/\u003e\u003c/a\u003e\n", 4 "coediting": true, 5 "comments_count": 0, 6 "created_at": "2019-09-21T08:33:45+09:00", 7 "group": null, 8 "id": "12qwqeqeqeq", 9 "likes_count": 0, 10 "private": false, 11 "reactions_count": 0, 12 "tags": [ 13 { 14 "name": "チュートリアル", 15 "versions": [] 16 } 17 ], 18 "title": "ステップ6 Qiita:Team運用方法のヒント", 19 "updated_at": "2019-09-21T08:33:45+09:00", 20 "url": "https://qiita.com/shared/items/xxxxxxx", 21 "user": { 22 "description": "", 23 "facebook_id": "", 24 "followees_count": 0, 25 "followers_count": 0, 26 "github_login_name": null, 27 "id": "xxxx", 28 "items_count": 0, 29 "linkedin_id": "", 30 "location": "", 31 "name": "S", 32 "organization": "", 33 "permanent_id": 392512, 34 "profile_image_url": "https://xxxxxxxx", 35 "team_only": false, 36 "twitter_screen_name": null, 37 "website_url": "" 38 }, 39 "page_views_count": null 40 } 41]

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>'

Article.fromJson の 引数の型は Map<String, dynamic> ですが、
対象のJsonレスポンスは List<Map<String, dynamic>> になっているため、エラーが発生しています。

このAPIは、ArticleのListを返す仕様なので、以下のようにループして変換させる必要があると思います

final body = json.decode(response.body); final articles = body.map((dynamic item) => Article.fromJson(item)).toList();

投稿2019/09/22 22:33

編集2019/09/22 22:36
popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ss-nantoka

2019/09/24 12:03

popobot様 ご回答いただきましてありがとうございます。 そういうことだったのですね。 すみません、試しに上記で書いて実行してみたところ、下記のように出力されてしまったのですが、何が足りないのでしょうか??度々申し訳ございません。 ``` flutter: articles: [Instance of 'Article', Instance of 'Article', Instance of 'Article', Instance of 'Article', Instance of 'Article', Instance of 'Article', Instance of 'Article', Instance of 'Article', Instance of 'Article'] ```
popobot

2019/09/24 21:44 編集

この出力は print(articles); の結果ですかね。変換がうまくいって Articleのインスタンスのリストが表示されているように見えます titleやurlが変換されているか見てみてください
ss-nantoka

2019/09/25 10:21

すみません、ご返信ありがとうございます。 articles.forEach((i) => print(i.title + ':' + i.url)); などで、表示されることを確認しました。 助かりました、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問