繁体   English   中英

将final转换为list <dynamic> 扑

[英]Convert final to list <dynamic> flutter

我有以下JSON:

"cast": [
    {
      "cast_id": 0,
      "character": "John Wick",
      "credit_id": "591d49ad925141499001b005",
      "gender": 2,
      "id": 6384,
      "name": "Keanu Reeves",
      "order": 0,
      "profile_path": "/bOlYWhVuOiU6azC4Bw6zlXZ5QTC.jpg"
    },
    {
      "cast_id": 9,
      "character": "Sofia",
      "credit_id": "5b031331925141097301b798",
      "gender": 1,
      "id": 4587,
      "name": "Halle Berry",
      "order": 1,
      "profile_path": "/hdUqx0on0cqbFuJCZtEGU42UWe5.jpg"
    },
]

我有以下方法来获取JSON并将其传递给模型:

final respuesta=await http.get(url);
final decodedData=json.decode(respuesta.body);
final cast=new Cast.fromJSONMap(decodedData['cast']);

最后一行引用模型中的此方法,从那里映射并保存数据:

Cast.fromJSONMap(List<dynamic> jsonList) {
    if (jsonList == null) return;

    for (var item in jsonList) {
      final actor = new Actor.fromJSONMap(item);
      actores.add(actor);
    }
  }

一切都适合我

现在我有以下JSON:

{
  "birthday": "1964-09-02",
  "known_for_department": "Acting",
  "deathday": null,
  "id": 6384,
  "name": "Keanu Reeves",
  "also_known_as": [
    "Киану Ривз",
    "كيانو ريفز",
    "키아누 리브스",
    "キアヌ・リーブス",
    "เคอานู รีฟส์",
    "基努·里维斯",
    "קיאנו ריבס",
    "Keanu Charles Reeves"
  ],
  "gender": 2,
  "biography": "XXXXXXXXXXXX",
  "popularity": 34.892,
  "place_of_birth": "Beirut, Lebanon",
  "profile_path": "/bOlYWhVuOiU6azC4Bw6zlXZ5QTC.jpg",
  "adult": false,
  "imdb_id": "nm0000206",
  "homepage": null
}

我想要恢复它并像上一个一样映射它,但是这个JSON没有像上一个例子那样包装它的xxx: []因此,当它传递给它时使用相同的方法映射它:

    final respuesta=await http.get(url);
    final decodedData=json.decode(respuesta.body);
    final person=new DetalleActor.fromJSONMap(decodedData);

像上一行一样的最后一行转到以下方法来映射它:

DetalleActor.fromJSONMap(List<dynamic> jsonList) {
    if (jsonList == null) return;

    for (var item in jsonList) {
      final persona = new Persona.fromJSONMap(item);
      personas.add(persona);
    }
  }

它向我显示以下错误:

在此输入图像描述

_TypeError (type '_InternalLinkedHashMap<String, dynamic>' 
is not a subtype of type 'List<dynamic>')

据我说,这是因为他正在等着像decodedData[xxx]这样的东西,但我不知道如何解决它。

根据我的理解, Personalso_know_as字段中的元素,那么你的错误是因为DetailActor.fromJSONMap(List <dynamic> jsonList)在等待Mapdynamic时正在等待List

这应该可以解决您的问题:

class Persona {
  String birthday;
  String knownForDepartment;
  String deathday;
  int id;
  String name;
  List<String> alsoKnownAs;
  int gender;
  String biography;
  double popularity;
  String placeOfBirth;
  String profilePath;
  String adult;
  String imdbId;
  String homepage;

  Persona({
    this.birthday,
    this.knownForDepartment,
    this.deathday,
    this.id,
    this.name,
    this.alsoKnownAs,
    this.gender,
    this.biography,
    this.popularity,
    this.placeOfBirth,
    this.profilePath,
    this.adult,
    this.imdbId,
    this.homepage,
  });

  Persona.fromJSONMap(Map<String, dynamic> json){
      birthday=json['birthday'];
      knownForDepartment=json['known_for_department'];
      deathday=json['death_day'];
      id=json['id'];
      name=json['name'];
      alsoKnownAs=json['also_known_as'].map((val) => val).toList();
      gender=json['gender'];
      biography=json['biography'];
      popularity=json['popularity'] / 1;
      placeOfBirth=json['place_of_birth'];
      profilePath=json['profile_path'];
      adult=json['adult'];
      imdbId=json['imdb_id'];
      homepage=json['homepage'];
  }
}

用法


    final respuesta=await http.get(url);
    final decodedData=json.decode(respuesta.body);
    final person= Persona.fromJSONMap(decodedData);

另一种安全的方法:

class DetalleActor {
  final bool adult;
  final List<String> alsoKnownAs;
  final String biography;
  final String birthday;
  final Object deathday;
  final int gender;
  final Object homepage;
  final int id;
  final String imdbId;
  final String knownForDepartment;
  final String name;
  final String placeOfBirth;
  final double popularity;
  final String profilePath;

  DetalleActor(
      {this.adult,
      this.alsoKnownAs,
      this.biography,
      this.birthday,
      this.deathday,
      this.gender,
      this.homepage,
      this.id,
      this.imdbId,
      this.knownForDepartment,
      this.name,
      this.placeOfBirth,
      this.popularity,
      this.profilePath});

  factory DetalleActor.fromJson(Map<String, dynamic> json) {
    return DetalleActor(
      adult: json['adult'] as bool,
      alsoKnownAs: _toList(json['also_known_as'], (e) => e as String),
      biography: json['biography'] as String,
      birthday: json['birthday'] as String,
      deathday: json['deathday'],
      gender: json['gender'] as int,
      homepage: json['homepage'],
      id: json['id'] as int,
      imdbId: json['imdb_id'] as String,
      knownForDepartment: json['known_for_department'] as String,
      name: json['name'] as String,
      placeOfBirth: json['place_of_birth'] as String,
      popularity: _toDouble(json['popularity']),
      profilePath: json['profile_path'] as String,
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'adult': adult,
      'also_known_as': _fromList(alsoKnownAs, (e) => e),
      'biography': biography,
      'birthday': birthday,
      'deathday': deathday,
      'gender': gender,
      'homepage': homepage,
      'id': id,
      'imdb_id': imdbId,
      'known_for_department': knownForDepartment,
      'name': name,
      'place_of_birth': placeOfBirth,
      'popularity': popularity,
      'profile_path': profilePath,
    };
  }
}

List _fromList(data, Function(dynamic) toJson) {
  if (data == null) {
    return null;
  }
  var result = [];
  for (var element in data) {
    var value;
    if (element != null) {
      value = toJson(element);
    }
    result.add(value);
  }
  return result;
}

double _toDouble(data) {
  if (data == null) {
    return null;
  }
  if (data is int) {
    return data.toDouble();
  }
  return data as double;
}

List<T> _toList<T>(data, T Function(dynamic) fromJson) {
  if (data == null) {
    return null;
  }
  var result = <T>[];
  for (var element in data) {
    T value;
    if (element != null) {
      value = fromJson(element);
    }
    result.add(value);
  }
  return result;
}

/*
DetalleActor:
  "birthday": String
  "known_for_department": String
  "deathday": Object
  "id": int
  "name": String
  "also_known_as": List<String>
  "gender": int
  "biography": String
  "popularity": double
  "place_of_birth": String
  "profile_path": String
  "adult": bool
  "imdb_id": String
  "homepage": Object
*/

将数组的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.

相关问题 如何转换列表<custommodel>至 Map<string,dynamic> 在 Flutter</string,dynamic></custommodel> 如何转换列表<dynamic>变成 Flutter 中的可视图像?</dynamic> 将数组的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 的动态列表 将其转换为列表 flutter firebase 将动态地图转换为列表? 转换列表<dynamic>列出<string></string></dynamic> 获取列表的长度<dynamic>在 flutter</dynamic> 转换清单 <T> 扑入json Flutter:如何将列表转换为JSON
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM