【问题标题】:How To Parsing Nested Json with POST Flutter如何使用 POST Flutter 解析嵌套的 Json
【发布时间】:2019-10-06 02:08:57
【问题描述】:

我想用 Flutter http 解析嵌套的 json。 我编写了我的代码,但在我的 ListView.builder 中没有显示数据。

我尝试使用嵌套 json 格式,但与 POST http 无关,因为我的 API 必须发送 API Key 才能获取响应值。

这个 Json 嵌套结果。

{
    "status": 1,
    "status_message": "Success!",
    "result": [
        {
            "id": "1",
            "ticket": "377292",
            "departmentid": "1",
            "clientid": "1",
            "userid": "0",
            "adminid": "1",
            "assetid": "1",
            "projectid": "1",
            "email": "email@email.com",
            "subject": "Test",
            "status": "Answered",
            "priority": "Normal",
            "timestamp": "2019-04-02 16:06:32",
            "notes": "",
            "ccs": false,
            "timespent": "0"
        },
        {
            "id": "2",
            "ticket": "424327",
            "departmentid": "1",
            "clientid": "1",
            "userid": "1",
            "adminid": "1",
            "assetid": "1",
            "projectid": "0",
            "email": "email@email.com",
            "subject": "test Tiket",
            "status": "Open",
            "priority": "Normal",
            "timestamp": "2019-05-19 05:48:37",
            "notes": "",
            "ccs": false,
            "timespent": "0"
        }
    ]
}

这是我的 Flutter 代码,请您对我的问题提出建议。

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:ticket_new/modal/ticketModel.dart';
import 'package:http/http.dart' as http;
class Report extends StatefulWidget {
  @override
  _ReportState createState() => _ReportState();
}

class _ReportState extends State<Report> {

  List<TicketModel> _list = [];
  var loading = false;
  Future<Null> _fetchData() async{
    setState(() {
      loading = true;
    });
    final response = await http.post("http://192.168.43.253/edc/api/index.php", body: {
      'key' : '5fpqRt23yU2kgJcl7fDo6ARIzsU5zIGAOIYtNPDBNokQcRViNfKnbaSiNow61lXG',
      'method' : 'get',
      'resource' : 'tickets',
    });
    if (response.statusCode == 200) {
        final data = jsonDecode(response.body);
        setState(() {
          for (Map i in data) {
          _list.add(TicketModel.fromJson(i));
          }
          loading = false;
        });
    } else {
    }
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _fetchData();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(

      body: Container(
        child: loading
        ? Center(child: CircularProgressIndicator())
        : ListView.builder(
          itemCount: _list.length,
          itemBuilder: (context, i){
            final x = _list[i];
            return Container(
              padding: EdgeInsets.all(10.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  Text(x.result.email),

                  Text(x.result.subject),
                ],
              ),
              );
          },
        ),
      ),
    );
  }
}

这是我在颤振代码中的模型构造函数。

class TicketModel{
  final int status;
  final String status_message;
  final ResultTicket result;

  TicketModel({this.status, this.status_message, this.result});
  factory TicketModel.fromJson(Map<String, dynamic> json) {
    return new TicketModel(
        status: json['status'],
        status_message: json['status_message'],
        result: ResultTicket.fromJson(json['result'],
        ));
  }
}

class ResultTicket{
  final int id;
  final int ticket;
  final int departmentid;
  final int clientid;
  final int userid;
  final int adminid;
  final int assetid;
  final int projectid;
  final String email;
  final String subject;
  final String status;
  final String priority;
  final String timestamp;
  final String notes;
  final String ccs;
  final int timespent;

  ResultTicket({this.id, this.ticket, this.departmentid, this.clientid, this.userid, this.adminid, this.assetid, this.projectid, this.email, this.subject, this.status, this.priority, this.timestamp, this.notes, this.ccs, this.timespent});

  factory ResultTicket.fromJson(Map<String, dynamic> json) {
    return new ResultTicket(
      id: json['id'],
      ticket: json['ticket'],
      departmentid: json['depatmentid'],
      clientid: json['clientid'],
      userid: json['userid'],
      adminid: json['adminid'],
      assetid: json['assetid'],
      projectid: json['projectid'],
      email: json['email'],
      subject: json['subject'],
      status: json['status'],
      priority: json['priority'],
      timestamp: json['timestamp'],
      notes: json['notes'],
      ccs: json['ccs'],
      timespent: json['timespent'],
    );
  }

}

【问题讨论】:

  • 希望http key不是真的
  • 是的不是真实的,这个 API 在我的笔记本电脑上的本地主机中。

标签: arrays json dart flutter


【解决方案1】:

首先,解析 ResultTicket 中的 JSON 值:

class ResultTicket {
  final int id;
  final int ticket;
  final int departmentid;
  final int clientid;
  final int userid;
  final int adminid;
  final int assetid;
  final int projectid;
  final String email;
  final String subject;
  final String status;
  final String priority;
  final String timestamp;
  final String notes;
  final bool ccs;
  final int timespent;

  ResultTicket({
    this.id,
    this.ticket,
    this.departmentid,
    this.clientid,
    this.userid,
    this.adminid,
    this.assetid,
    this.projectid,
    this.email,
    this.subject,
    this.status,
    this.priority,
    this.timestamp,
    this.notes,
    this.ccs,
    this.timespent,
  });

  factory ResultTicket.fromJson(Map<String, dynamic> json) {
    return new ResultTicket(
      id: parseToIntIfNotNull(json['id']),
      ticket: parseToIntIfNotNull(json['ticket']),
      departmentid: parseToIntIfNotNull(json['depatmentid']),
      clientid: parseToIntIfNotNull(json['clientid']),
      userid: parseToIntIfNotNull(json['userid']),
      adminid: parseToIntIfNotNull(json['adminid']),
      assetid: parseToIntIfNotNull(json['assetid']),
      projectid: parseToIntIfNotNull(json['projectid']),
      email: json['email'],
      subject: json['subject'],
      status: json['status'],
      priority: json['priority'],
      timestamp: json['timestamp'],
      notes: json['notes'],
      ccs: json['ccs'],
      timespent: parseToIntIfNotNull(json['timespent']),
    );
  }

  static int parseToIntIfNotNull(String string) {
    if (string == null) return null;
    else return int.parse(string);
  }
}

其次,您没有TicketModel 的列表,您有ResultTicket 的列表,因此更改您的TicketModel 以提取并存储该ResultTicket 列表:

class TicketModel {
  final int status;
  final String status_message;
  final List<ResultTicket> results;

  TicketModel({this.status, this.status_message, this.results});

  factory TicketModel.fromJson(Map<String, dynamic> json) {
    List<ResultTicket> results = (json['result'] as List)
        .map((resultTicketJson) => ResultTicket.fromJson(resultTicketJson))
        .toList();

    return TicketModel(
      status: json['status'],
      status_message: json['status_message'],
      results: results,
    );
  }
}

然后让您的 Widget 适应这些变化:

class Report extends StatefulWidget {
  @override
  _ReportState createState() => _ReportState();
}

class _ReportState extends State<Report> {
  TicketModel ticketModel;
  bool loading;

  Future<Null> _fetchData() async {
    setState(() => loading = true);

    final response = await http.post("http://192.168.43.253/edc/api/index.php", body: {
      'key' : '5fpqRt23yU2kgJcl7fDo6ARIzsU5zIGAOIYtNPDBNokQcRViNfKnbaSiNow61lXG',
      'method' : 'get',
      'resource' : 'tickets',
    });

    if (response.statusCode == 200) {
      final data = jsonDecode(response.body);
      final ticketModelFromJson = TicketModel.fromJson(data);

      setState(() {
        ticketModel = ticketModelFromJson;
        loading = false;
      });
    } else {
    }
  }

  @override
  void initState() {
    super.initState();
    _fetchData();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: loading
            ? Center(child: CircularProgressIndicator())
            : ListView.builder(
                itemCount: ticketModel.results.length,
                itemBuilder: (context, i) {
                  final x = ticketModel.results[i];
                  return Container(
                    padding: EdgeInsets.all(10.0),
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: <Widget>[
                        Text(x.email),
                        Text(x.subject),
                      ],
                    ),
                  );
                },
              ),
      ),
    );
  }
}

【讨论】:

  • 你能解释一下这段代码 = static int parseToIntIfNotNull(String string) { int.tryParse(source) if (string == null) return null;否则返回 int.parse(string); } 因为我在 vs 代码中收到了错误消息。
  • 嗨,hugo,我正在实现你的代码,但仍然出错(不显示数据)。
  • 对不起,这段代码不应该在那里。只需删除该行,这段代码就可以工作了。
  • 当您从 JSON 中获取 ID 时,它们是字符串。此代码将它们从 String 解析为 int。
猜你喜欢
  • 2020-09-24
  • 2021-02-25
  • 2019-01-24
  • 2020-11-08
  • 2020-05-21
  • 2023-04-02
  • 2019-12-30
  • 2021-02-09
  • 2018-07-12
相关资源
最近更新 更多