繁体   English   中英

如何转换列表<custommodel>至 Map<string,dynamic> 在 Flutter</string,dynamic></custommodel>

[英]How to convert List<CustomModel> to Map<String,dynamic> in Flutter

我在 Flutter 中使用 HydratedBloc。 为了使用 HydratedBloc,我需要将我的自定义 List(从 JSON 字符串解析) List<List<Category>>转换为Map<String, dynamic> 这是我用来解析 json 字符串的 model

import 'dart:convert';

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

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

class Category {
  Category({
    this.title,
    this.imageLink,
  });

  String title;
  String imageLink;

  factory Category.fromJson(Map<String, dynamic> json) => Category(
    title: json["title"] == null ? null : json["title"],
    imageLink: json["imageLink"] == null ? null : json["imageLink"],
  );

  Map<String, dynamic> toJson() => {
    "title": title == null ? null : title,
    "imageLink": imageLink == null ? null : imageLink,
  };
}

在这里我需要将List<List<Category>>转换为Map<String, dynamic>

class TrendingCategoriesCubit extends Cubit<TrendingCategoriesState>
    with HydratedMixin {
  Repository repository;

  TrendingCategoriesCubit({@required this.repository})
      : super(TrendingCategoriesLoading());

  Future<void> fetchTrendingCategories() async {
    emit(TrendingCategoriesLoading());
    List<List<Category>> categories =
        await repository.fetchTrendingCategories();
    if (categories.isEmpty) {
      emit(TrendingCategoriesFetchedEmpty());
    } else if (categories.isNotEmpty) {
      emit(TrendingCategoriesFetched(categories: categories));
    }
  }

  @override
  TrendingCategoriesState fromJson(Map<String, dynamic> json) {
    try {
      final categories = rpTrendingCategoriesFromJson(json.toString());
      return TrendingCategoriesFetched(categories: categories);
    } catch (_) {
      return null;
    }
  }

  @override
  Map<String, dynamic> toJson(TrendingCategoriesState state) {
    if (state is TrendingCategoriesFetched) {
      return state.categories.toJson(); //coudn't do it
    } else {
      return null;
    }
  }
}

如果您查看上面的toJson()方法,我需要将List<List<Categor>>返回到Map<String,dynamic 我该怎么做?

实现所需结果的简单解决方法是为 Hydrated BLoC 的 toJson/fromJson 部分创建 Map:

@override
TrendingCategoriesState fromJson(Map<String, dynamic> json) {
  try {
    final categoriesJson = json['categories'];
    final categories = rpTrendingCategoriesFromJson(json.toString());
    return TrendingCategoriesFetched(categories: categories);
  } catch (_) {
    return null;
  }
}

@override
Map<String, dynamic> toJson(TrendingCategoriesState state) {
  if (state is TrendingCategoriesFetched) {
    return <String, dynamic>{
      'categories': state.categories.toJson(),
    };
  } else {
    return null;
  }
}

只需稍微调整代码即可编译,但总体思路是创建一个“临时” Map object 仅用于持久化和恢复水合的 state。

将数组的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:如何将字符串转换为 Map<string, dynamic> 在 json</string,> Flutter 中的 Json 解析:列表<dynamic >不是“地图”类型的子类型<String,dynamic> &#39; Flutter 错误:列表<dynamic>不是 Map 类型的子类型<string, dynamic></string,></dynamic> 未处理的异常:键入“列表”<dynamic> &#39; 不是类型 &#39;Map 的子类型<String, dynamic> &#39; 在颤动中如何像这样发布 json obj 如何转换清单 <Map<String, dynamic> &gt;在地图内 <String, dynamic> 在Dart中转换为JSON? Flutter Dart:如何使用 2 键将列表转换为 Map 将动态地图转换为列表? 如何从列表中检索数据<Map<String, dynamic> &gt; DataTable 中的模型颤动? Flutter - Map<string, dynamic> 至 Map<string, myobject></string,></string,>
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM