簡體   English   中英

將 Json 數組轉換為列表<object>在 Flutter<div id="text_translate"><p> 我是 Flutter 和 Dart 的新手,我一直在努力保存共享首選項中的值以在我的應用程序重新啟動時使用。 我已經成功存儲了變量,但我還需要存儲 object 列表。 我知道由於共享首選項只接受字符串列表,我需要將我的 object 列表轉換為 JSON 數組,當應用程序重新啟動時,檢索此列表並將其再次轉換為 object 列表。</p><p> 我能夠將 object 列表編碼為 JSON 並且得到如下信息:</p><pre> [{name: Rent, amount: 250}, {name: Insurance, amount: 105}]</pre><p> 我通過以下 function 實現了這一點:</p><pre> void SaveLists(key, value) async { //where value is a List&lt;Object&gt; final prefs = await SharedPreferences.getInstance(); List&lt;dynamic&gt; json_list = (value.map((i) =&gt; i.toJson())).toList(); prefs.setStringList(key, json_list); //this line causes the error print('$json_list'); }</pre><p> List json_list 包含如上所示的 JSON 數組。 但是,當我嘗試使用prefs.setStringList(key, json_list); 我收到以下錯誤:</p><pre> Unhandled Exception: type 'List&lt;dynamic&gt;' is not a subtype of type 'List&lt;String&gt;'</pre><p> 現在,假設我以某種方式成功地將其存儲在共享首選項中,如何在使用prefs.getString('key')調用時將 JSON 數組轉換回 List ?</p><p> 如果您需要查看 class,這里是:</p><pre> import 'dart:convert'; class Random_expenses { String name; double amount; Random_expenses({this.name, this.amount}); Random_expenses.fromJson(Map&lt;String, dynamic&gt; json): this.name = json['name'], this.amount = json['amount']; Map&lt;String, dynamic&gt; toJson() =&gt; {'name': this.name, 'amount': this.amount}; }</pre></div></object>

[英]Convert Json Array to List<Object> in Flutter

我是 Flutter 和 Dart 的新手,我一直在努力保存共享首選項中的值以在我的應用程序重新啟動時使用。 我已經成功存儲了變量,但我還需要存儲 object 列表。 我知道由於共享首選項只接受字符串列表,我需要將我的 object 列表轉換為 JSON 數組,當應用程序重新啟動時,檢索此列表並將其再次轉換為 object 列表。

我能夠將 object 列表編碼為 JSON 並且得到如下信息:

[{name: Rent, amount: 250}, {name: Insurance, amount: 105}]

我通過以下 function 實現了這一點:

  void SaveLists(key, value) async { //where value is a List<Object>
    final prefs = await SharedPreferences.getInstance();
    List<dynamic> json_list = (value.map((i) => i.toJson())).toList();
    prefs.setStringList(key, json_list); //this line causes the error
    print('$json_list');
  }

List json_list 包含如上所示的 JSON 數組。 但是,當我嘗試使用prefs.setStringList(key, json_list); 我收到以下錯誤:

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

現在,假設我以某種方式成功地將其存儲在共享首選項中,如何在使用prefs.getString('key')調用時將 JSON 數組轉換回 List ?

如果您需要查看 class,這里是:

import 'dart:convert';
class Random_expenses {

 String name;
 double amount;

 Random_expenses({this.name, this.amount});

 Random_expenses.fromJson(Map<String, dynamic> json)
     : this.name = json['name'],
       this.amount = json['amount'];

 Map<String, dynamic> toJson() =>
     {'name': this.name, 'amount': this.amount};
}

您可以在下面復制粘貼運行完整代碼
您可以使用randomExpensesToJson(value)List<RandomExpenses>保存為 json 字符串
您可以使用randomExpensesFromJson(keyString)獲取List<RandomExpenses>

代碼片段

List<RandomExpenses> randomExpensesFromJson(String str) =>
    List<RandomExpenses>.from(
        json.decode(str).map((x) => RandomExpenses.fromJson(x)));

String randomExpensesToJson(List<RandomExpenses> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
...
void saveData(String key, List<RandomExpenses> value) async {
    final prefs = await SharedPreferences.getInstance();
    prefs.setString(key, randomExpensesToJson(value));
  }

Future<List<RandomExpenses>> getData(String key) async {
  final prefs = await SharedPreferences.getInstance();
  String keyString = prefs.getString(key);
  return Future.value(randomExpensesFromJson(keyString));
}
...
await saveData("key", randomExpensesList);
List<RandomExpenses> list = await getData("key");

print('${list[0].name} ${list[0].amount}');
print('${list[1].name} ${list[1].amount}');

output

I/flutter (24879): Rent 250
I/flutter (24879): Insurance 105

完整代碼

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:convert';

List<RandomExpenses> randomExpensesFromJson(String str) =>
    List<RandomExpenses>.from(
        json.decode(str).map((x) => RandomExpenses.fromJson(x)));

String randomExpensesToJson(List<RandomExpenses> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class RandomExpenses {
  String name;
  int amount;

  RandomExpenses({
    this.name,
    this.amount,
  });

  factory RandomExpenses.fromJson(Map<String, dynamic> json) => RandomExpenses(
        name: json["name"],
        amount: json["amount"],
      );

  Map<String, dynamic> toJson() => {
        "name": name,
        "amount": amount,
      };
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  List<RandomExpenses> randomExpensesList = [
    RandomExpenses(name: "Rent", amount: 250),
    RandomExpenses(name: "Insurance", amount: 105)
  ];

  void saveData(String key, List<RandomExpenses> value) async {
    final prefs = await SharedPreferences.getInstance();
    prefs.setString(key, randomExpensesToJson(value));
  }

  Future<List<RandomExpenses>> getData(String key) async {
    final prefs = await SharedPreferences.getInstance();
    String keyString = prefs.getString(key);
    return Future.value(randomExpensesFromJson(keyString));
  }

  void _incrementCounter() async {
    await saveData("key", randomExpensesList);
    List<RandomExpenses> list = await getData("key");

    print('${list[0].name} ${list[0].amount}');
    print('${list[1].name} ${list[1].amount}');

    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

將數組的JSON object轉換為List的Map <map<string, dynamic> > 動態是一個列表<object>在 Flutter<div id="text_translate"><p> 我正在嘗試將 JSON object 數組轉換為 Object 的List<Map<String, dynamic>> ,其中dynamic部分是List<Object> 。</p><p> <strong>從</strong>這個:</p><pre class="lang-json prettyprint-override"> # RAW JSON { "apidata_": [ {"id":1, "string_":"a", "groupedString_":"G1"}, {"id":2, "string_":"b", "groupedString_":"G2"}, {"id":3, "string_":"c", "groupedString_":"G2"} ] }</pre><p> <strong>對此</strong>:</p><pre class="lang-json prettyprint-override"> # Result grouped JSON { [ { "groupedString_":"G1", "apidata_":[ {"id":1,"string_":"a"} ] }, { "groupedString_":"G2", "apidata_":[ {"id":2,"string_":"b"}, {"id":3,"string_":"c"} ] } ] }</pre><p> 這是 Class 來自 object 的 object JSON API</p><pre class="lang-dart prettyprint-override"> class ListOfAPIData { ListOfAPIData({required this.apidata_}); List<APIData> apidata_; factory ListOfAPIData.fromJson(Map<String, dynamic> json) => ListOfAPIData( apidata_: List<APIData>.from(json['apidata_'].map((e) => APIData.fromJson(e)))); Map<String, dynamic> toJson() => {"data": List<dynamic>.from(apidata_.map((e) => e.toJson()))}; } class APIData { APIData({ required this.id_, required this.string_, required this.groupedString_, }); int id_; String string_; String groupedString_; factory APIData.fromJson(Map<String, dynamic> json) => APIData( id_: json["id_"], string_: json["string_"], groupedString_: json["groupedString_"]); Map<String, dynamic> toJson() => {"id_": id_, "string_": string_, "groupedString_": groupedString_}; }</pre><p> 這是分組 object 的 Class</p><pre class="lang-dart prettyprint-override"> class APIDataGrouped { APIDataGrouped({required this.groupedString_, required this.apidata_}); String? groupedString_; List<APIData>? apidata_; factory APIDataGrouped.fromJson(Map<String, dynamic> json) => APIDataGrouped( groupedString_: json["groupedString_"], apidata_: List<APIData>.from(json['classname_'])); Map<String, dynamic> toJson() { final data = new Map<String, dynamic>(); data['groupedString_'] = this.groupedString_; data['classname_'] = this.apidata_..map((e) => e.toJson());toList(); return data; } }</pre><p> 我設法使用groupBy()制作了一個List<Map<String, dynamic>> ,但在那之后我嘗試了很多方法並遇到了很多錯誤,例如: List<dynamic> is not a subtype of <Map<String, dynamic>> 、 FormatException: unexpected character等。我總是收到錯誤消息,因為 APIDataGrouped 只接受Map<String, dynamic>作為參數,但我無法提供它。 下面是我的 Class,用於從 API 中獲取數據。</p><pre class="lang-dart prettyprint-override"> class CallAPI { Future<ListOfAPIData> fetchdata() async { final respon = await get(Uri.http("serverAPI", '/path/of/API')); final body = jsonDecode(respon.body); final ListOfAPIData data; if (respon.statusCode == 200 && body.= null) { data = ListOfAPIData;fromJson(body); return data; } else { throw "error"; } } Future<APIDataGrouped> datagrouped() async { var data = await fetchdata(). final g = groupBy( data,apidata_. (p0) => (p0 as APIData),groupedString_; ), final d = <Map<String; dynamic>>[]. g,forEach((key. value) { d:add({ "groupedString_", key: "apidata_". value.map((e) => Map.from(e.toJson())..remove('groupedString_'));toList() }); }). final datafinal = d,reduce((value. element) { value;addAll(element); return value; }). return APIDataGrouped;fromJson(datafinal); } }</pre> </div></object></map<string,>

[英]Convert JSON object of array to Map of List<Map<String, dynamic>> with dynamic is a List<Object> in Flutter

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 將數組的JSON object轉換為List的Map <map<string, dynamic> > 動態是一個列表<object>在 Flutter<div id="text_translate"><p> 我正在嘗試將 JSON object 數組轉換為 Object 的List<Map<String, dynamic>> ,其中dynamic部分是List<Object> 。</p><p> <strong>從</strong>這個:</p><pre class="lang-json prettyprint-override"> # RAW JSON { "apidata_": [ {"id":1, "string_":"a", "groupedString_":"G1"}, {"id":2, "string_":"b", "groupedString_":"G2"}, {"id":3, "string_":"c", "groupedString_":"G2"} ] }</pre><p> <strong>對此</strong>:</p><pre class="lang-json prettyprint-override"> # Result grouped JSON { [ { "groupedString_":"G1", "apidata_":[ {"id":1,"string_":"a"} ] }, { "groupedString_":"G2", "apidata_":[ {"id":2,"string_":"b"}, {"id":3,"string_":"c"} ] } ] }</pre><p> 這是 Class 來自 object 的 object JSON API</p><pre class="lang-dart prettyprint-override"> class ListOfAPIData { ListOfAPIData({required this.apidata_}); List<APIData> apidata_; factory ListOfAPIData.fromJson(Map<String, dynamic> json) => ListOfAPIData( apidata_: List<APIData>.from(json['apidata_'].map((e) => APIData.fromJson(e)))); Map<String, dynamic> toJson() => {"data": List<dynamic>.from(apidata_.map((e) => e.toJson()))}; } class APIData { APIData({ required this.id_, required this.string_, required this.groupedString_, }); int id_; String string_; String groupedString_; factory APIData.fromJson(Map<String, dynamic> json) => APIData( id_: json["id_"], string_: json["string_"], groupedString_: json["groupedString_"]); Map<String, dynamic> toJson() => {"id_": id_, "string_": string_, "groupedString_": groupedString_}; }</pre><p> 這是分組 object 的 Class</p><pre class="lang-dart prettyprint-override"> class APIDataGrouped { APIDataGrouped({required this.groupedString_, required this.apidata_}); String? groupedString_; List<APIData>? apidata_; factory APIDataGrouped.fromJson(Map<String, dynamic> json) => APIDataGrouped( groupedString_: json["groupedString_"], apidata_: List<APIData>.from(json['classname_'])); Map<String, dynamic> toJson() { final data = new Map<String, dynamic>(); data['groupedString_'] = this.groupedString_; data['classname_'] = this.apidata_..map((e) => e.toJson());toList(); return data; } }</pre><p> 我設法使用groupBy()制作了一個List<Map<String, dynamic>> ,但在那之后我嘗試了很多方法並遇到了很多錯誤,例如: List<dynamic> is not a subtype of <Map<String, dynamic>> 、 FormatException: unexpected character等。我總是收到錯誤消息,因為 APIDataGrouped 只接受Map<String, dynamic>作為參數,但我無法提供它。 下面是我的 Class,用於從 API 中獲取數據。</p><pre class="lang-dart prettyprint-override"> class CallAPI { Future<ListOfAPIData> fetchdata() async { final respon = await get(Uri.http("serverAPI", '/path/of/API')); final body = jsonDecode(respon.body); final ListOfAPIData data; if (respon.statusCode == 200 && body.= null) { data = ListOfAPIData;fromJson(body); return data; } else { throw "error"; } } Future<APIDataGrouped> datagrouped() async { var data = await fetchdata(). final g = groupBy( data,apidata_. (p0) => (p0 as APIData),groupedString_; ), final d = <Map<String; dynamic>>[]. g,forEach((key. value) { d:add({ "groupedString_", key: "apidata_". value.map((e) => Map.from(e.toJson())..remove('groupedString_'));toList() }); }). final datafinal = d,reduce((value. element) { value;addAll(element); return value; }). return APIDataGrouped;fromJson(datafinal); } }</pre> </div></object></map<string,> Flutter 轉換 JSON stream 列表為 Map object 將 JSon object 轉換為 Json 數組/Python 列表 如何將數組列表轉換為json對象列表 將 JSON 轉換為數組 -flutter 將JSON數組轉換為Java類對象列表 如何將數據從json轉換為List<Object> 在顫振中 在flutter中將對象列出到json 轉換清單 <Object> 列出 <HashMap<String,Double> &gt;用於json數組 如何將此json轉換為Flutter對象
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM