前提・実現したいこと
カーリルのサイトに蔵書検索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
以上、よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー