【问题标题】:How can I manipulate JSON data in dart / flutter for use in a listview如何在 dart/flutter 中操作 JSON 数据以在列表视图中使用
【发布时间】:2021-06-24 03:34:35
【问题描述】:

背景

我有以下通过异步请求远程检索的 JSON 数据,我正在尝试在 Flutter 中构建列表视图。

如您所见,第一项是“登录”,这与所有其他项完全不同

当我尝试从数据中构建列表视图时,我在颤振中遇到了很多麻烦(我是一个完全颤抖的菜鸟 --> 这是第 0 天)。

[
  {
    "loggedin": "0"
  }, 
  {
    "id": "1",
    "title": "Title 1",
    "excerpt": "",
    "thumb": "Image 1.jpg",
    "threadid": "1",
    "fid": "1",
    "commentcount": "1",
    "postdate": 1
}, {
    "id": "2",
    "title": "Title 2",
    "excerpt": "",
    "thumb": "Image 2.jpg",
    "threadid": "2",
    "fid": "2",
    "commentcount": "2",
    "postdate": 2
}, {
    "id": "3",
    "title": "Title 3",
    "excerpt": "",
    "thumb": "Image3.jpg",
    "threadid": "3",
    "fid": "3",
    "commentcount": "3",
    "postdate": 3
}
]

我的概念解决方案

我正在考虑删除第一个登录的项目并形成一个只有项目 1-3 的全新 Json 数组

我的问题

是否可以遍历解码后的json数据,形成一个新的数组?

我可以成功访问列表中的单个项目,如下所示:

  _map = json.decode(response.body)[1];

但是当我尝试遍历我的列表时它失败了

      final decoded = json.decode(response.body) as dynamic;
              decoded.forEach((key, value) {
                if (key != "loggedin") {
                  debugPrint('hi');
                }
              });

如果我尝试只遍历其中一项,那么它确实有效:

      final decoded = json.decode(response.body)[1] as dynamic;
      decoded.forEach((key, value) {
        debugPrint(key+': '+value);
      });

我需要遍历我的列表作为起点,以挑选出我想从最终列表中删除的项目(基本上是键为“loggedin”的项目,但我在这里失败了

替代方案

我意识到我的方法的概念很可能存在缺陷或乏味。如果有任何其他替代方法可以实现我的目标似乎更好,我会全神贯注! :)

【问题讨论】:

  • @Pythony 当我尝试迭代整个列表时,我收到了这个错误:type '(dynamic,dynamic) => Null' is not a subtype of '(dynamic) => dynamic' of 'f'

标签: flutter dart


【解决方案1】:

发生错误是因为您的数据是地图列表,但在列表迭代器中,您传递了一个带有两个参数的函数,该函数适用于地图。

你应该这样做 -

final decoded = json.decode(response.body) as dynamic;
              decoded.forEach((data) {
                //data is a Map
              });

您可以像这样访问各个键 - data["loggedin"]

要检查它是否包含'loggedin',你可以做data.containsKey("loggedin")

对于列表,forEach 中的函数接受一个 Argument,它是一个列表项,对于 Map,它接受两个参数,一个键及其对应的值。

【讨论】:

  • 这很好用!作为后续,我可能会问:您将如何删除第一个登录项目并返回所有剩余数据完整的列表或地图,而无需重新重新定义所有内容?
  • 很高兴它有帮助!您可以使用此 decoded.removeAt(0); 删除列表中的第一项;
【解决方案2】:

我建议使用以下字段创建一个模型类:

  • 身份证
  • 标题
  • 摘录
  • 拇指
  • 线程ID
  • fid
  • 评论数
  • 发布日期
  • 登录

现在,对于第一项,除 loggedin 之外的所有字段都将为空,而对于其他项目,loggedin 将为空。

【讨论】:

    【解决方案3】:

    将响应转换为List<Map>,遍历列表,忽略包含键loggedin的项目

        final List<Map> list = json.decode(response.body);
        list.forEach((element) { 
          if(!element.containsKey("loggedin")){
            //Here element is map of your required item
            //You can convert it to your required model
          }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-30
      • 2021-11-13
      • 2022-11-25
      • 2018-12-23
      • 2021-05-20
      • 2020-01-06
      • 2021-12-28
      相关资源
      最近更新 更多