如何在 flutter 中处理来自同一来源的不同 JSON 响应

How to handle different JSON Responses from same source in flutter

我有一个 flutter 应用程序在某个时候检索 list/or 任何与此相关的内容,如果请求有任何问题,则会收到不同的响应。
例如:

{
  "status" : "success",
  "message":
    [
      {
        "updated_on" : "2022-01-09 14:26:07"
      }
    ]
}

失败:

{
  "status" : "error",
  "message" : "Query not found"
}

使用 quicktype.io,我创建了 class,如下所示:

class ResponseList {
  ResponseList({
    required this.status,
    required this.message,
  });

  String status;
  List<dynamic> message;

  factory ResponseList.fromJson(Map<String, dynamic> json) => ResponseList(
        status: json["status"],
        message: List<dynamic>.from(json["message"].map((x) => CLASSNAME.fromJson(x))),
      );

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

现在,问题是,如果失败,当我尝试调用 ResponseList responseAllFromJson(String str) => ResponseList.fromJson(json.decode(str)); 时会引发异常,其中异常显示
[ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: type 'String' is not a subtype of type 'List<dynamic>'.

我想要一个首先检查状态的方法,无论是成功还是失败,然后解析 json 的剩余部分(在 message 中)或解析整个 json和 returns 适当的响应(失败时的文本和成功时的对象列表)。
注意:我想要一个可重用的代码,以便我可以将响应传递给该方法并从我的应用程序中的任何位置检索它。例如:

static bool responseStatus(dynamic response) {
    if (response != null) {
      if (responseListFromJson(response).status.trim().toLowerCase() == 'success') {
        return true;
      }
    }
    return false;
  }

目前,上述方法在失败时引发异常,但在成功时运行顺利。

解析的时候可以试试这个

class MainResponse {
  String status;
  dynamic message;

  MainResponse({this.status, this.message});

  MainResponse.fromJson(Map<String, dynamic> json) {
    status = json['status'];
    if(json['message'] is String)  {

      message = json['message'];
    }else {

      message = <Message>[];
      json['message'].forEach((v) {
        message.add(new Message.fromJson(v));
      });

    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['status'] = this.status;
    if (this.message != null) {

      if(this.message is String) {
        data['message'] = this.message;
      }else {
        data['message'] = this.message.map((v) => v.toJson()).toList();
      }
    }
    return data;
  }
}

class Message {
  String updatedOn;

  Message({this.updatedOn});

  Message.fromJson(Map<String, dynamic> json) {
    updatedOn = json['updated_on'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['updated_on'] = this.updatedOn;
    return data;
  }
}

并这样调用:

MainResponse mainResponse = MainResponse.fromJson(response);

还有这个:

 if(mainResponse.message is String) {
      var data = mainResponse.message as String;
      print('parsed String $data');
    }else {

      var list = mainResponse.message as List<Message>;
      print('parsed ${list[0].updatedOn }');
    }