【问题标题】:Flutter : How to parse JSON Array of objectsFlutter:如何解析 JSON 对象数组
【发布时间】:2021-07-13 14:53:42
【问题描述】:

谁能告诉我如何在颤振中解析对象数组。当我解析 json 时出现错误,因为 List 不是 Map 类型的子类型。

下面是我需要解析的json文件。请帮我解决这个问题。

[
{
    "empPayslipsId": "2021012000440",
    "month": "Jan",
    "description": "Payslip for JAN 2021 (Month End)",
    "paymentPeriod": "1/1/2021 12:00:00 AM - 1/31/2021 12:00:00 AM",
    "lastAccessBy": "0002\r\n118.200.199.70",
    "lastAccessDate": "20210202",
    "lastAccessTime": "105706",
    "successAccess": "2",
    "failAccess": "2"
}
]









Future<void> loadQueryPeriod(int year, var month) async {
String baseURL = '${domainURL}api/PaySlip?year=$year&month=$month';
try {
  final response = await http.get(baseURL, headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization':
        'Bearer ${Provider.of<UserVM>(navigatorKey.currentContext, listen: false).accessToken}',
  });
  print('UIC PDF response : ${response.body}');
  print(
      'UIC Token response : ${Provider.of<UserVM>(navigatorKey.currentContext, listen: false).accessToken}');
  if (response.statusCode == 200) {
    final Map<String, dynamic> data = json.decode(response.body);
    print('result type: ${data.runtimeType}');
  }
} catch (e) {
  print(e);
  throw Exception('Download PDF Fail! ${e.toString()}');
 }
}
}

【问题讨论】:

    标签: json flutter


    【解决方案1】:

    改成这样:

     final Map<String, dynamic> data = json.decode(response.body)[0];
    

    这是因为您的地图位于列表中。查看包含您的地图的方括号[ ]。您需要的地图位于此列表的index[0]

    【讨论】:

      【解决方案2】:

      使用这个podo类:

      // Generated by https://quicktype.io
      // To parse this JSON data, do
      //
      //     final sample = sampleFromJson(jsonString);
      
      import 'dart:convert';
      
      List<Sample> sampleFromJson(String str) {
          final jsonData = json.decode(str);
          return new List<Sample>.from(jsonData.map((x) => Sample.fromJson(x)));
      }
      
      String sampleToJson(List<Sample> data) {
          final dyn = new List<dynamic>.from(data.map((x) => x.toJson()));
          return json.encode(dyn);
      }
      
      class Sample {
          String empPayslipsId;
          String month;
          String description;
          String paymentPeriod;
          String lastAccessBy;
          String lastAccessDate;
          String lastAccessTime;
          String successAccess;
          String failAccess;
      
          Sample({
              this.empPayslipsId,
              this.month,
              this.description,
              this.paymentPeriod,
              this.lastAccessBy,
              this.lastAccessDate,
              this.lastAccessTime,
              this.successAccess,
              this.failAccess,
          });
      
          factory Sample.fromJson(Map<String, dynamic> json) => new Sample(
              empPayslipsId: json["empPayslipsId"],
              month: json["month"],
              description: json["description"],
              paymentPeriod: json["paymentPeriod"],
              lastAccessBy: json["lastAccessBy"],
              lastAccessDate: json["lastAccessDate"],
              lastAccessTime: json["lastAccessTime"],
              successAccess: json["successAccess"],
              failAccess: json["failAccess"],
          );
      
          Map<String, dynamic> toJson() => {
              "empPayslipsId": empPayslipsId,
              "month": month,
              "description": description,
              "paymentPeriod": paymentPeriod,
              "lastAccessBy": lastAccessBy,
              "lastAccessDate": lastAccessDate,
              "lastAccessTime": lastAccessTime,
              "successAccess": successAccess,
              "failAccess": failAccess,
          };
      }
      

      现在为了解析json调用,

      Sample sample = sampleFromJson(jsonString);

      通过这个您将获得对示例 PODO 类的访问权限,并且您可以访问任何您想要的对象。

      【讨论】:

      • 谢谢!你救了我的命:)
      【解决方案3】:

      您通过调用get 请求收到的初始数据不存储在地图中,而是存储在列表中。

      你应该做这样的事情来接收你的初始数据。

      if (response.statusCode == 200) {
          final List<dynamic> data = json.decode(response.body);
      }
      

      从那里,它们有多种方法可以从您的 data 变量中获取数据。如果需要,您可以在此处使用列表,例如在 JSON 中获取 month 的值。

      final String month = data[0]['month'];
      

      如果您更喜欢使用地图,语法如下所示

      final Map<String, dynamic> endpointData = data[0];
      final String responseKey = 'month';
      final var result = endpointData[responseKey];
      

      【讨论】:

        【解决方案4】:

        如果你有数据模型,你可以这样做

         fromJsonList(List<dynamic> jsonList) {
            List<YourModel> yourModelList = [];
            jsonList.forEach((jsonModel) {
              menuModelsOfferList.add(YourModel.fromJson(jsonModel));
            });
        

        【讨论】:

          猜你喜欢
          • 2019-12-01
          • 2019-01-14
          • 1970-01-01
          • 2022-01-09
          • 1970-01-01
          • 2020-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多