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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Q&A

1回答

2068閲覧

【flutter/sharedPreference】Jsonデコード時、文字列からList<Map<String,String>>型への変換がしたい

teteco

総合スコア0

Flutter

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

0グッド

0クリップ

投稿2021/04/06 05:55

前提・実現したいこと

flutterで家計簿アプリ(支出記録のみ)を作成しています
  • 今回、アプリに登録した家計簿の内容を、sharedPreferencesを使用して、データ保存及び読み込みをしています。
  • sharedPreferencesの使用時には、Jsonへのエンコード及びデコードを実行します。
sharedPreferencesに保存している内容
  • 家計簿に登録するデータは、日時、費目、金額です。

  • 例)

Dart

1 2//2020年4月1日の支出 日用品1000円、食費500円の場合 3//Map<String,List<Map<String,String>>>型 4{2020/4/1, [{費目:日用品,金額:1000},{費目:食費,金額:500}]} 5
今回やりたいこと
  • sharedPreferencesからデータを読み込む際に、Jsonからデコードする。
  • このとき、JsonにはMap{String,String}型で保存されているため、取り出した時もkey,valueともにStrirng型。
  • このString型のデータを、読み込み時に、List<Map<String,Strign>>型に変換したい

現在sharedPreferencesのファイルには、

{ "2021年04月1日": "[{費目:日用品,金額:1000},{費目:食費,金額:500}]" }

という形で保存されています。

アプリ側で読み込む際は、そのままString型で読み込まれます。

こちらを、読み込み時にString型から
List<Map<String,Strig>>型の、

[{費目:日用品,金額:1000},{費目:食費,金額:500}]

という形に変換するよう実装したいです。

  • 今のところ、デコード時に型変換をするライブラリや関数があるのではないかと考え、探しています。
  • Google検索では「Json デコード 型変換」で調べましたが、ほしい情報に辿り着くことができませんでした。

どのように考えてみるとよいか、アドバイスをお願いいたします。

情報が不足している等についても、教えていただけるとありがたいです。

該当のソースコード

Dart

1class _CalenderState extends State<Calender> { 2 3 //支出の記録リスト 4 Map<DateTime, List<Map<String, String>>> dataList = {}; 5 6 // データの保存 7 Future _saveFile(BuildContext context) async { 8 SharedPreferences prefs = await SharedPreferences.getInstance(); 9 for( DateTime key in dataList.keys) { 10 String saveList = jsonEncode(dataList[key]); 11 prefs.setString(key.toString(), saveList); 12 } 13 } 14 15 // データの読み込み 16 Future _readFile(BuildContext context) async { 17 SharedPreferences prefs = await SharedPreferences.getInstance(); 18 setState(() { 19 20    //保存しているデータのKeyを、変数keyに入れて、forin文で回す 21 for( String key in prefs.getKeys()) { 22 23 //保存したデータのkeyをdecodeして、DateTime型にする 24 DateTime tempDataKeys = DateTime.parse(jsonDecode(jsonEncode(key))); 25 26 //保存したデータのvalueをdecodeして、List<Map<String,String>>型にしたい。 27 List<Map<String,String>> tempValueList =jsonDecode(jsonEncode(prefs.getString(key.toString()))); 28 } 29 }); 30 } 31 }

エラー

  • 上記コードの場合、

Dart

1//保存したデータのvalueをdecodeして、List<Map<String,String>>型にしたい。 2 List<Map<String,String>> tempValueList =jsonDecode(jsonEncode(prefs.getString(key.toString())));

ここで、getStringメソッドを使用し、デコードを実行してます。
このため、「String型は、List<Map<String,String>>型のサブタイプではありません」というエラーが出ます。

試したこと

  • List型で読み込みできればよいのでは、と考え、getStringメソッドをgetStringListメソッドに変更してみました。

しかしこの場合、変換後の型はList<String>型であり、変換したいList<Map<String,String>>型ではないため、上記と同様のエラーが出ました。

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

macBookPro
Flutter 1.22.5
Dart 2.10.4

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

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

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

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

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

guest

回答1

0

jsonEncode関数が余計で、jsonDecode(prefs.getString(key.toString()))です。

また直接List<Map<String,String>>型の変数では受け取れませんので、
List<dynamic>として扱う必要があります。

dart

1import 'dart:convert'; 2 3void main() { 4 try { 5 final json = '[{"費目":"日用品","金額":1000},{"費目":"食費","金額":500}]'; 6 7 final List<dynamic> data = jsonDecode(json); 8 print('data = $data'); 9 print(data.runtimeType); // JSArray<dynamic> --> List<dynamic> 10 print(data[0].runtimeType); // _JsonMap --> Map<dynamic> 11 print(data[0]['費目']); // 日用品 12 print(data[0]['金額']); // 1000 13 14 } catch (error) { 15 print(error); 16 } 17}

投稿2021/04/12 17:29

satokei

総合スコア1217

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問