【问题标题】:Flutter dart json Unhandled Exception: InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<dynamic>Flutter dart json 未处理的异常:InternalLinkedHashMap<String, dynamic>' 不是 'List<dynamic> 类型的子类型
【发布时间】:2020-06-04 03:34:10
【问题描述】:

我从我的另一个问题中得到了这段代码(感谢 chunhunghan)。我需要创建一个登录屏幕,并尝试根据服务器发回给我的响应来验证用户凭据,但是每次我尝试运行代码时,它都会给我“未处理的异常:InternalLinkedHashMap”不是类型的子类型列表”错误,我不确定如何修复它。

这就是模型:

import 'dart:convert';
Payload payloadFromJson(String str) => Payload.fromJson(json.decode(str));

String payloadToJson(Payload data) => json.encode(data.toJson());

class Payload {
  Payload({
    this.version,
    this.encoding,
    this.subsonicResponse,
  });

  String version;
  String encoding;
  SubsonicResponse subsonicResponse;

  factory Payload.fromJson(Map<String, dynamic> json) => Payload(
        version: json["version"],
        encoding: json["encoding"],
        subsonicResponse: SubsonicResponse.fromJson(json["subsonic-response"]),
      );

  Map<String, dynamic> toJson() => {
        "version": version,
        "encoding": encoding,
        "subsonic-response": subsonicResponse.toJson(),
      };
}

class SubsonicResponse {
  SubsonicResponse({
    this.status,
    this.version,
    this.xmlns,
    this.albumList,
  });

  String status;
  String version;
  String xmlns;
  AlbumList albumList;

  factory SubsonicResponse.fromJson(Map<String, dynamic> json) =>
      SubsonicResponse(
        status: json["status"],
        version: json["version"],
        albumList: AlbumList.fromJson(json["albumList"]),
      );

  Map<String, dynamic> toJson() => {
        "status": status,
        "version": version,
        "albumList": albumList.toJson(),
      };
}

class AlbumList {
  AlbumList({
    this.album,
  });

  List<AlbumsList> album;

  factory AlbumList.fromJson(Map<String, dynamic> json) => AlbumList(
        album: json["album"] == null ? null: List<AlbumsList>.from(json["album"].map((x) => AlbumsList.fromJson(x))),);

  Map<String, dynamic> toJson() => {
        "album": album == null ? null: List<dynamic>.from(album.map((x) => x.toJson())),
      };
}

class AlbumsList {
  AlbumsList({
    this.id,
    this.parent,
    this.isDir,
    this.title,
    this.album,
    this.artist,
    this.genre,
    this.coverArt,
    this.playCount,
    this.created,
    this.year,
  });

  String id;
  String parent;
  String isDir;
  String title;
  String album;
  String artist;
  String genre;
  String coverArt;
  String playCount;
  DateTime created;
  String year;

  factory AlbumsList.fromJson(Map<String, dynamic> json) => AlbumsList(
        id: json["id"],
        parent: json["parent"],
        isDir: json["isDir"],
        title: json["title"],
        album: json["album"],
        artist: json["artist"],
        genre: json["genre"],
        coverArt: json["coverArt"],
        playCount: json["playCount"],
        created: DateTime.parse(json["created"]),
        year: json["year"] == null ? null : json["year"],
      );

  Map<String, dynamic> toJson() => {
        "id": id,
        "parent": parent,
        "isDir": isDir,
        "title": title,
        "album": album,
        "artist": artist,
        "genre": genre,
        "coverArt": coverArt,
        "playCount": playCount,
        "created": created.toIso8601String(),
        "year": year == null ? null : year,
      };
}

这是请求:

Future <Payload>fetchResponse() async{
final authresponse = await http.get(authURL);
if (authresponse.statusCode == 200){
final jsondata = jsonDecode(authresponse.body);
return payloadFromJson(jsondata);
}else
throw Exception("Unable to connect to server, try again");
}

它给了我返回线上的错误。 编辑:我忘了添加 api 响应。

{
   "subsonic-response": {
      "status": "ok",
      "version": "1.15.0"
   }
}

这是 api 响应

【问题讨论】:

  • 将payloadFromJson更改为Payload payloadFromJson(Map&lt;String, dynamic&gt;str) =&gt; Payload.fromJson(str);
  • @Nidheesh 刚刚尝试过,解决了该错误,但由于某种原因,当我尝试打印它显示为空的对象时。
  • 你能发布json吗
  • @Nidheesh 是的,我用 json 数据更新了帖子

标签: json rest http flutter dart


【解决方案1】:

payloadFromJson 更改为

Payload payloadFromJson (Map<String, dynamic>str) => Payload.fromJson(str);

如果 json 包含密钥,则从 json 中获取值

 factory SubsonicResponse.fromJson(Map<String, dynamic> json) =>
      SubsonicResponse(
        status: json["status"],
        version: json["version"],
        albumList: json.containsKey("albumList")? AlbumList.fromJson(json["albumList"]):null,
      );

【讨论】:

  • 我将如何将亚音速响应的状态与字符串进行比较?
  • 你可以在String中使用compareTo方法
猜你喜欢
  • 2019-08-21
  • 1970-01-01
  • 2021-12-29
  • 2022-10-05
  • 1970-01-01
  • 2021-08-01
  • 2021-08-15
  • 1970-01-01
  • 2021-08-03
相关资源
最近更新 更多