質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
Flutter

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Dart

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

Q&A

解決済

1回答

1190閲覧

Dartのキーワード(continueなど)と同じ文字列がAPIのレスポンスのキーにある場合、fromJson()でfreezedのクラスにする方法が知りたい。

massanmesu

総合スコア36

Flutter

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Dart

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

0グッド

0クリップ

投稿2021/10/18 03:58

前提・実現したいこと

カーリルのサイトに蔵書検索APIがあります。
そこから取得したデータをJsonに変換し、freezedで作成したモデルクラスとして作成したいのですが、レスポンスのキーの中にDartの制御構文に使うcontinueキーワードと同じ文字列が存在しています。
イメージ説明

データモデル

dart

1import 'package:freezed_annotation/freezed_annotation.dart'; 2import 'package:flutter/foundation.dart'; 3 4part 'lib_data_has_book.freezed.dart'; 5part 'lib_data_has_book.g.dart'; 6 7 8class LibDataHasBook with _$LibDataHasBook { 9 const factory LibDataHasBook( 10 String session, Map<String, dynamic> books, int continue) = _LibDataHasBook; 11 12 factory LibDataHasBook.fromJson(Map<String, dynamic> json) => 13 _$LibDataHasBookFromJson(json); 14}

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

『continueはキーワードなのでidとして使用できません』という旨のエラーが発生します。

error: 'continue' can't be used as an identifier because it's a keyword. (expected_identifier_but_got_keyword at [practice_freezed_dio] lib/models/lib_data_has_book.dart:14)

エラーを消すためには別の変数名にすれば良いだけなのですが、それだと取得時にキーの一致ができずにエラーが発生しました。

test.dart

dart

1import 'package:flutter_test/flutter_test.dart'; 2import 'package:dio/dio.dart'; 3import 'package:practice_freezed_dio/models/lib_data_has_book.dart'; 4 5const apikey = '***************'; 6 7void main() { 8 9 test('カーネルAPIからレスポンスを取得しモデル化', () async { 10 final url = 'https://api.calil.jp/check?appkey=$apikey&isbn=4834000826&systemid=Aomori_Pref&format=json&callback=no'; 11 try { 12 var response = await Dio().get(url); 13 final libData = LibDataHasBook.fromJson(response.data); 14 print(libData); 15 } catch (e) { 16 print(e); 17 } 18 }); 19}

おそらく、取得に失敗してるのでNullが入ってしまっているのだと思います。

Run

1Testing started at 12:47 ... 2 3type 'Null' is not a subtype of type 'int' in type cast

当然ですが、continueのプロパティを消したところ正常にクラス化できました。

Run

1Testing started at 12:42 ... 2 3LibDataHasBook(session: 1b15fd875d6bb9de98aa7dcf7ed34905, books: {4834000826: {Aomori_Pref: {status: Cache, libkey: {青県図: 貸出可}, reserveurl: https://api.calil.jp/reserve?id=8064c16f247bab252a26c089a396b879}}})

どうすればcontinueの値を取得できるかが知りたいです。

試したこと

C言語ではキーワードの先頭にを入れると変数として使用できるとネットで知り、ダメもとで試しましたが無理でした。
また、文字列として認識させる$を先頭に入れてもエラーが発生します。
取得後にキーの値を別のものに変える、という処理をすればと思ったのですが、そのような方法は可能なのでしょうか?検索してもうまくヒットしません。。。

補足情報(FW/ツールのバージョンなど)

pubspec.yaml(の一部)

dependencies: flutter: sdk: flutter cupertino_icons: ^1.0.2 freezed_annotation: ^0.15.0 json_annotation: ^4.3.0 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^1.0.0 build_runner: ^2.1.4 freezed: ^0.15.0+1 json_serializable: ^6.0.0

以上、よろしくお願いします。

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

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

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

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

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

massanmesu

2021/10/21 00:33

合ってはいますが、'for'の部分でerror: Expected an identifier が発生してしまいます。 オプトイン(?)についてはすみませんが読んでもわかりませんでした。
hoshi-takanori

2021/10/21 01:32

'for' (シングルクオート) じゃなくて `for` (バッククオート) では。
massanmesu

2021/10/22 00:51

試しましたが、エラーは解消されませんでした。
guest

回答1

0

自己解決

@JsonKey(name: 'continue') int isOKというコードに書き換えたところ正常にモデル化できました。
JsonKey()でのマッピング方法を学んでるうちに発見しました。

@freezed class LibraryHasBookData with _$LibraryHasBookData { factory LibraryHasBookData( {required String session, required Map<String, dynamic> books, - int continue + @JsonKey(name: 'continue') required int isOK}) = _LibraryHasBookData; factory LibraryHasBookData.fromJson(Map<String, dynamic> json) => _$LibraryHasBookDataFromJson(json); }

投稿2021/10/29 08:35

massanmesu

総合スコア36

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問