[英]How to convert List<CustomModel> to Map<String,dynamic> in Flutter
[英]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]
这样的东西,但我不知道如何解决它。
根据我的理解, Person
是also_know_as
字段中的元素,那么你的错误是因为DetailActor.fromJSONMap(List <dynamic> jsonList)
在等待Map
或dynamic
时正在等待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
*/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.