【问题标题】:How do I load the json from mulitple rows in Flutter如何从 Flutter 中的多行加载 json
【发布时间】:2026-01-12 17:00:01
【问题描述】:

我正在尝试加载从 Web 服务获取的数据,但没有任何结果。 JSON 恢复正常,但我无法将其解码以在我的应用程序中使用。我还可以在 Web 浏览器中使用该 URL,并且 JSON 可以正常返回。我想我可能试图错误地解码和加载 JSON。 任何关于我哪里出错的帮助都会很棒。谢谢大家。

干杯,

保罗

JSON 示例:

{
   "rows":[
      {
         "JOBID":23,
         "START_DATE":1588809600000,
         "START_TIME":"07:30",
         "JOB_NAME":"Cleaner"
      },
      {
         "JOBID":23,
         "START_DATE":1588809600000,
         "START_TIME":"08:30",
         "JOB_NAME":"Manager"
      }
   ]
}

型号:

class StaffJobs {
  List<SJRows> sjRows;

  StaffJobs({this.sjRows});

  StaffJobs.fromJson(Map<String, dynamic> json) {
    if (json['rows'] != null) {
      sjRows = List<SJRows>();
      json['rows'].forEach((v) {
        sjRows.add(SJRows.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = Map<String, dynamic>();
    if (this.sjRows != null) {
      data['rows'] = this.sjRows.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class SJRows {
  int jobId;
  int startDate;
  String startTime;
  String jobName;

  SJRows(
      {this.jobId,
      this.startDate,
      this.startTime,
      this.jobName});

  SJRows.fromJson(Map<String, dynamic> json) {
    jobId = json['JOBID'];
    startDate = json['START_DATE'];
    startTime = json['START_TIME'];
    jobName = json['JOB_NAME'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = Map<String, dynamic>();
    data['JOBID'] = this.jobId;
    data['START_DATE'] = this.startDate;
    data['START_TIME'] = this.startTime;
    data['JOB_NAME'] = this.jobName;
    return data;
  }
}

在我打印作业计数的 initState 中,我得到 0。

在我在 ListTile 中显示几个字段的代码末尾附近,我不确定如何引用数据。

在我测试 response.statusCode 为 200 之后,我尝试将 response.body 打印到控制台并且所有 JSON 都在那里,所以 http.get 工作正常。

我还在控制台中看到一个错误: E/flutter (15432): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] 未处理的异常:类型“_InternalLinkedHashMap”不是类型转换中“List”类型的子类型

在我尝试加载员工职位的屏幕中,我有以下代码:

class MyJobs extends StatefulWidget {
  @override
  _MyJobsState createState() => new _MyJobsState();
}

class _MyJobsState extends State<MyJobs> {
  List<StaffJobs> jobs = List();
  bool isLoading = false;

  _getJobs() async {
    setState(() {
      isLoading = true;
    });
    final response = await http.get(Uri.encodeFull('$jobUrl'));
    if (response.statusCode == 200) {
      setState(() {
        isLoading = false;
      });
      jobs = (json.decode(response.body) as List).map((data) => StaffJobs.fromJson(data)).toList();
    } else {
      throw Exception('Failed to load jobs');
    }
  }

  @override
  void initState() {
    super.initState();
    _getJobs();
    print('Count = ${jobs.length}');
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: rmoAppBar(subText: 'My Jobs'),
      drawer: RmoMenu(),
      body: isLoading
          ? Center(child: CircularProgressIndicator())
          : Container(
              child: ListView.builder(
                itemCount: jobs.length,
                itemBuilder: (BuildContext context, int index) {
                  return ListTile(
                    title: Text(jobs[index].sjRows.jobName),    <------ Not sure how to reference data
                    subtitle: Text(jobs[index].sjRows.startTime),  <--- This doesn't compile
                  );
                },
              ),
            ),
    );
  }
}

【问题讨论】:

    标签: http flutter


    【解决方案1】:

    你不是 正确解码。

    跟随代码,同时帮助你更多。

    class MyJobs extends StatefulWidget {
      @override
      _MyJobsState createState() => new _MyJobsState();
    }
    
    class _MyJobsState extends State<MyJobs> {
      StaffJobs jobs;
      bool isLoading = false;
    
      _getJobs() async {
        setState(() {
          isLoading = true;
        });
        final response = await http.get(Uri.encodeFull('$jobUrl'));
        if (response.statusCode == 200) {
          setState(() {
            isLoading = false;
          });
          jobs = StaffJobs.fromJson(json.decode(response.body));
        } else {
          throw Exception('Failed to load jobs');
        }
    
        setState(() {
          isLoading = false;
        });
      }
    
      @override
      void initState() {
        super.initState();
        _getJobs();
        print('Count = ${jobs.sjRows.length}');
      }
    
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: rmoAppBar(subText: 'My Jobs'),
          drawer: RmoMenu(),
          body: isLoading
              ? Center(child: CircularProgressIndicator())
              : Container(
                  child: ListView.builder(
                    itemCount: jobs.sjRows.length,
                    itemBuilder: (BuildContext context, int index) {
                      return ListTile(
                        title: Text(jobs.sjRows[index].jobName),
                        subtitle: Text(jobs.sjRows[index].startTime),
                      );
                    },
                  ),
                ),
        );
      }
    }
    
    class StaffJobs {
      List<SJRows> sjRows;
    
      StaffJobs({this.sjRows});
    
      StaffJobs.fromJson(Map<String, dynamic> json) {
        if (json['rows'] != null) {
          sjRows = List<SJRows>();
          json['rows'].forEach((v) {
            sjRows.add(SJRows.fromJson(v));
          });
        }
      }
    
      Map<String, dynamic> toJson() {
        final Map<String, dynamic> data = Map<String, dynamic>();
        if (this.sjRows != null) {
          data['rows'] = this.sjRows.map((v) => v.toJson()).toList();
        }
        return data;
      }
    }
    
    class SJRows {
      int jobId;
      int startDate;
      String startTime;
      String jobName;
    
      SJRows({this.jobId, this.startDate, this.startTime, this.jobName});
    
      SJRows.fromJson(Map<String, dynamic> json) {
        jobId = json['JOBID'];
        startDate = json['START_DATE'];
        startTime = json['START_TIME'];
        jobName = json['JOB_NAME'];
      }
    
      Map<String, dynamic> toJson() {
        final Map<String, dynamic> data = Map<String, dynamic>();
        data['JOBID'] = this.jobId;
        data['START_DATE'] = this.startDate;
        data['START_TIME'] = this.startTime;
        data['JOB_NAME'] = this.jobName;
        return data;
      }
    }
    

    【讨论】:

    • 嗨,Viren,感谢您的回答。真的很感激。我有一个问题,代码不会编译。我收到一个错误:jobs = StaffJobs.fromJson(response);错误:无法将参数类型“响应”分配给参数类型“地图”。 (argument_type_not_assignable at [rostermeon] lib\pages\my_shifts.dart:31)有什么想法吗?谢谢。
    • @PaulCoshott 立即查看。如果这不起作用,那么我需要 jobUrl 来帮助你更多。
    • 非常感谢。这很好用。非常感谢您的帮助。祝你有美好的一天。
    最近更新 更多