【问题标题】:How to get json array in Flutter/Dart如何在 Flutter/Dart 中获取 json 数组
【发布时间】:2020-07-06 16:09:45
【问题描述】:

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

我想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
    }
}

【问题讨论】:

    标签: json flutter dart


    【解决方案1】:

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

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

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

    给你

        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;
        }
    }
    

    【讨论】:

    • 嗨 Darish 感谢您的帮助,但是如果我想打印所有属性“名称”,我应该在我的调用 api 代码中做什么?很抱歉打扰,因为我对 JSON 很陌生。
    【解决方案2】:

    这个错误是有道理的。 JSON 中的“数据”属性是数组。因此,您必须传递项目的索引才能访问“名称”属性 - 类似于 - data['data'][0]['name'] 以获得“Maybank”。

    理想情况下,您应该有一个从 JSON 创建实例的类。在这种情况下,代码 sn-p 将如下所示:

    Banks banks = new Banks.fromJson(data)
    

    现在,您可以使用this 之类的网站来创建类定义(包括.fromJson)。

    【讨论】:

    • 感谢分享 Sukhi。
    猜你喜欢
    • 2021-12-28
    • 2019-03-26
    • 1970-01-01
    • 2019-12-30
    • 2020-09-25
    • 1970-01-01
    • 2020-01-02
    • 2019-02-23
    • 2020-03-04
    相关资源
    最近更新 更多