简体   繁体   English

如何在 Flutter 的 ListView Builder 中解析嵌套的 json 数组响应数据

[英]How to parse nested json array response data in ListView Builder in Flutter

I am trying to parse json response data, in this response there are nested array list and i want to display table_id: 39 and on next line or under table_id: 39 i want to display table_id: 40 .我正在尝试解析 json 响应数据,在此响应中有嵌套数组列表,我想显示table_id: 39并在下一行或下table_id: 39我想显示table_id: 40 Now problem is when it completes on table_id: 39 then it should go to table_id: 40 and display but instead it shows 0floor is null .现在的问题是当它在table_id: 39上完成时,它应该 go 到table_id: 40并显示,但它显示0floornull Can anyone help me in which step i am doing wrong.谁能帮助我在哪一步我做错了。

JSON RESPONSE JSON 响应

{
    "message": "floors returned",
    "floorData": [
        {
            "0floor": [
                {
                    "table_id": "39"
                }
            ]
        },
        {
            "1floor": [
                {
                    "table_id": "40"
                }
            ]
        }
    ]
}

Model Model

class TablesFloorData0floor {

  String? tableId;

  TablesFloorData0floor({
    this.tableId,
  });
  TablesFloorData0floor.fromJson(Map<String, dynamic> json) {
    tableId = json['table_id']?.toString();
  }
  Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
    data['table_id'] = tableId;
    return data;
  }
}

class TablesFloorData {

  List<TablesFloorData0floor?>? the0floor;

  TablesFloorData({
    this.the0floor,
  });
  TablesFloorData.fromJson(Map<String, dynamic> json) {
    if (json['0floor'] != null) {
      final v = json['0floor'];
      final arr0 = <TablesFloorData0floor>[];
      v.forEach((v) {
        arr0.add(TablesFloorData0floor.fromJson(v));
      });
      the0floor = arr0;
    }
  }
  Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
    if (the0floor != null) {
      final v = the0floor;
      final arr0 = [];
      v!.forEach((v) {
        arr0.add(v!.toJson());
      });
      data['0floor'] = arr0;
    }
    return data;
  }
}

class Tables {
  String? message;
  List<TablesFloorData?>? floorData;

  Tables({
    this.message,
    this.floorData,
  });
  Tables.fromJson(Map<String, dynamic> json) {
    message = json['message']?.toString();
    if (json['floorData'] != null) {
      final v = json['floorData'];
      final arr0 = <TablesFloorData>[];
      v.forEach((v) {
        arr0.add(TablesFloorData.fromJson(v));
      });
      floorData = arr0;
    }
  }
  Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
    data['message'] = message;
    if (floorData != null) {
      final v = floorData;
      final arr0 = [];
      v!.forEach((v) {
        arr0.add(v!.toJson());
      });
      data['floorData'] = arr0;
    }
    return data;
  }
}

home.dart主页.dart

  Widget showTable(
      List<TablesFloorData> data, StateSetter setStateBT, String lang) {
    return Container(
        child: ListView.builder(
            shrinkWrap: true,
            itemCount: data.length,
            itemBuilder: (BuildContext context, int index) {
              return Column(
                children: [
                  Text('test'),
                  ListView.builder(
                      shrinkWrap: true,
                      itemCount: data[index].the0floor!.length,
                      itemBuilder: (BuildContext context, int ind) {
                        return Text(data[index].the0floor![index]!.tableId!);
                      })
                ],
              );
            }));
  }

Try this.. Create one floor class and use a key parameter to parse the floor level.试试这个.. 创建一层 class 并使用关键参数解析楼层。

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: Home(),
    );
  }
}

class Home extends StatelessWidget {
  const Home({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    var data = (json['floorData'] as List<Map<String, dynamic>>)
        .map((f) => TablesFloorData.fromJson(f))
        .toList();
    return Scaffold(
      body: Center(
        child: ListView.builder(
          shrinkWrap: true,
          itemCount: data.length,
          itemBuilder: (BuildContext context, int index) {
            return Column(
              children: [
                Text('test'),
                ListView.builder(
                    shrinkWrap: true,
                    itemCount: data[index].tables.length,
                    itemBuilder: (BuildContext context, int ind) {
                      return Text(
                        data[index].tables[ind].id,
                        textAlign: TextAlign.center,
                      );
                    })
              ],
            );
          },
        ),
      ),
    );
  }
}

class TablesFloorData {
  final List<TableDate> tables;
  final int floor;

  TablesFloorData({
    required this.floor,
    required this.tables,
  });
  factory TablesFloorData.fromJson(Map<String, dynamic> json) =>
      TablesFloorData(
          floor: int.parse(json.keys.first.replaceAll('floor', '')),
          tables: json.values.first.map<TableDate>((tableJson) {
            return TableDate.fromJson(tableJson);
          }).toList());

  Map<String, dynamic> toJson() {
    return {'${floor}floor': tables.map((t) => t.toJson())};
  }
}

class TableDate {
  String id;

  TableDate({
    required this.id,
  });

  factory TableDate.fromJson(Map<String, dynamic> json) => TableDate(
        id: json['table_id'] as String,
      );

  Map<String, dynamic> toJson() {
    return <String, dynamic>{
      'table_id': id,
    };
  }
}

var json = {
  "message": "floors returned",
  "floorData": [
    {
      "0floor": [
        {"table_id": "39"}
      ]
    },
    {
      "1floor": [
        {"table_id": "40"}
      ]
    }
  ]
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM