json - 将最终转换为列表扑
问题描述
我有以下 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]
但我不知道如何解决。
解决方案
另一种安全的方法:
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
*/
推荐阅读
- express - 如何设置 GraphQL 端点?
- java - Android Studio Java WebView 记住我登录
- javascript - Javascript没有调用第二个函数
- python - Pandas:如何将行转为列
- c++ - RE2 嵌套正则表达式组匹配
- flutter - Flutter 展示本地图片或资产
- flutter - Flutter - Inkwell 波纹显示在其子图像上
- asp.net - Bootstrap Carousel 在 ASP.NET 上不滑动
- javascript - 对象数组到常规数组,其中列出的值来自对象中的特定键
- azure - 是否每次我需要推送文件时都不需要输入 Azure DevOps 密码?