首页 > 解决方案 > 如何在 Flutter/Dart 中获取 json 数组

问题描述

我只想从数组数据中获取所有“名称”的数据。

我想print(data['data']['name']); 但它返回此错误: 未处理的异常:类型'String'不是'index'类型'int'的子类型

但是当我print(data['data']);,它会从“数据”返回所有数据:

"data": [
        {
            "created_at": "2020-03-16 16:10:51",
            "deleted_at": null,
            "id": 2,
            "is_active": 1,
            "name": "Maybank",
            "updated_at": "2020-03-16 16:18:06"
        },
        {
            "created_at": "2020-03-16 16:27:37",
            ......
    ],

调用 API 代码

displayBanks(BuildContext context) async {
    _callApi.refreshTokenApi(context);
    var _addressUrl = '$_hostUrl/banks'; //API URL
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    _accessToken = prefs.getString('access_token');
    Response _response = await get(_addressUrl, headers: {
      'Content-type': 'application/json',
      'Accept': 'application/json',
      'Authorization': 'Bearer $_accessToken'
    });
    var data;
    data = jsonDecode(_response.body);
    if (_response.statusCode == 200) {
      print(data['data']['name']);
      return data;
    }
    else {
      print(_response.statusCode);
    }
  }

来自 API URL 的 JSON 数据示例:

{
    "data": [
        {
            "created_at": "2020-03-16 16:10:51",
            "deleted_at": null,
            "id": 2,
            "is_active": 1,
            "name": "Maybank",
            "updated_at": "2020-03-16 16:18:06"
        },
        {
            "created_at": "2020-03-16 16:27:37",
            "deleted_at": null,
            "id": 3,
            "is_active": 1,
            "name": "India International Bank (Malaysia) Berhad",
            "updated_at": "2020-03-16 16:27:37"
        },
        {
            "created_at": "2020-03-16 16:27:37",
            "deleted_at": null,
            "id": 4,
            "is_active": 1,
            "name": "National Bank of Abu Dhabi Malaysia Berhad",
            "updated_at": "2020-03-16 16:27:37"
        }
    ],
    "links": {
        "first": "https://demo.local/api/banks?page=1",
        "last": "https://demo.local/api/banks?page=1",
        "next": null,
        "prev": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "path": "https://demo.local/api/banks",
        "per_page": 5,
        "to": 3,
        "total": 3
    }
}

标签: jsonflutterdart

解决方案


未处理的异常:“String”类型不是“index”的“int”类型的子类型

异常消息清楚地解释了该问题。

属性“名称”位于一个对象内部,该对象本身放置在一个数组中。所以你首先解码数组。然后使用索引 (0..n) 访问每个对象,然后从每个对象中,您可以读取“名称”属性。

干得好

    class MyData {
    final List<Data> data;

    MyData({this.data});

    factory MyData.fromJson(Map<String, dynamic> json) {
        return MyData(
            data: json['data'] != null ? (json['data'] as List).map((i) => Data.fromJson(i)).toList() : null,
        );
    }

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

class Data {
    final String created_at;
    final String deleted_at;
    final int id;
    final int is_active;
    final String name;
    final String updated_at;

    Data({this.created_at, this.deleted_at, this.id, this.is_active, this.name, this.updated_at});

    factory Data.fromJson(Map<String, dynamic> json) {
        return Data(
            created_at: json['created_at'],
            deleted_at: json['deleted_at'],
            id: json['id'],
            is_active: json['is_active'],
            name: json['name'],
            updated_at: json['updated_at'],
        );
    }

    Map<String, dynamic> toJson() {
        final Map<String, dynamic> data = new Map<String, dynamic>();
        data['created_at'] = this.created_at;
        data['id'] = this.id;
        data['is_active'] = this.is_active;
        data['name'] = this.name;
        data['updated_at'] = this.updated_at;
        data['deleted_at'] = this.deleted_at;
        return data;
    }
}

推荐阅读