在flutter中过滤json数据

Posted

技术标签:

【中文标题】在flutter中过滤json数据【英文标题】:Filtering jsonData in flutter 【发布时间】:2020-08-29 16:40:49 【问题描述】:

我有一个如下所示的 json 响应。从响应中,我需要过滤“隶属关系”具有deptId = 1的“数据”。 json 响应为:


    "success": true,
    "data": [
            "id": 4,
            "userId": 11,
            "active": true,
            "affiliations": [
                    "id": 3,
                    "deptId": 1,
                    "active": true,
                    "createdAt": "2020-04-28T05:28:12.065Z",
                    "updatedAt": "2020-04-28T05:28:12.065Z"
                ,
                
                    "id": 4,
                    "deptId": 2,
                    "active": true,
                    "createdAt": "2020-04-28T05:28:12.065Z",
                    "updatedAt": "2020-04-28T05:28:12.065Z"
                
            ]
        ,
        
            "id": 5,
            "userId": 6,
            "active": true,
            "affiliations": [
                "id": 5,
                "deptId": 1,
                "active": true,
                "createdAt": "2020-04-28T05:28:12.065Z",
                "updatedAt": "2020-04-28T05:28:12.065Z"
            ]
        ,
        
            "id": 7,
            "userId": 11,
            "active": true,
            "affiliations": [
                "id": 6,
                "deptId": 1,
                "active": true,
                "createdAt": "2020-04-28T05:28:12.065Z",
                "updatedAt": "2020-04-28T05:28:12.065Z"
            ]
        
    ]

要根据活动状态进行过滤,我会这样做:

snapshot.data['data'].where((data)=>data['active']==true)).toList()

上述问题的语法是什么?

【问题讨论】:

您好,您能更好地解释一下您期望得到的结果项吗?所有至少拥有 deptId==1 或其他会员的用户?谢谢 是的。这就是我所说的。我需要隶属于 deptId 1 的“数据”。但没关系。我在服务器端进行了修改[添加了一个包含所有附属部门 id 的关键部门,并检查了 data.depts 是否包含 1]。它正在工作。 我很高兴你解决了它;如果你想检查这个: List list = snap["data"].where((d) return d["active"]==true && d["affiliations"].any((dd)=>dd[ "deptId"]==1); ).toList(); list.forEach((el)=>print("$el["userId"]")); 感谢您的解决方案。但我最近才发现这一点,并为其他相同的问题实现了确切的语法。我正要在这里发布这个答案。 【参考方案1】:

出于参考目的,我将在这里编写 2 个工作方法来过滤列表而不使用 for 循环。

import 'dart:convert';

final String body = """
  
    "success": true,
    "data": [
            "id": 4,
            "userId": 11,
            "active": true,
            "affiliations": [
                    "id": 3,
                    "deptId": 1,
                    "active": true,
                    "createdAt": "2020-04-28T05:28:12.065Z",
                    "updatedAt": "2020-04-28T05:28:12.065Z"
                ,
                
                    "id": 4,
                    "deptId": 2,
                    "active": true,
                    "createdAt": "2020-04-28T05:28:12.065Z",
                    "updatedAt": "2020-04-28T05:28:12.065Z"
                
            ]
        ,
        
            "id": 5,
            "userId": 6,
            "active": true,
            "affiliations": [
                "id": 5,
                "deptId": 1,
                "active": true,
                "createdAt": "2020-04-28T05:28:12.065Z",
                "updatedAt": "2020-04-28T05:28:12.065Z"
            ]
        ,
        
            "id": 7,
            "userId": 11,
            "active": true,
            "affiliations": [
                "id": 6,
                "deptId": 1,
                "active": true,
                "createdAt": "2020-04-28T05:28:12.065Z",
                "updatedAt": "2020-04-28T05:28:12.065Z"
            ]
        
    ]

  """;

void main() 
  Map snap = jsonDecode(body);

  List data = snap["data"];

  /*
  Find all items that have at least 1 subitem with deptId==1
  Output is: 11, 6, 11
  */
  List list1 = data
      .where((d) =>
          d["active"] == true &&
          d["affiliations"].any((dd) => dd["deptId"] == 1))
      .toList();
  list1.forEach((el) => print("$el["userId"]"));

  /*
  Find all subitems which have deptId==1
  Output is: 3, 5, 6
  */
  List list2 = data
      .where((d) => d["active"] == true)
      .toList()
      .map((d) => d["affiliations"]
          .map((aff) => aff)
          .toList()
          .where((dd) => dd["deptId"] == 1)
          .toList())
      .toList();
  list2.forEach((el) => print(el[0]["id"]));


希望对你有帮助。

【讨论】:

感谢您的解决方案,但经过反复试验,我已经弄清楚了。它现在正在工作。但很高兴有同样问题的其他人现在能够轻松解决。【参考方案2】:

我不知道您的应用程序结构如何,但我通常使用 if else 来仅显示我想要显示的数据,例如,如果我使用 listview 构建器,我在 Container 或 Text 小部件之前添加了类似的内容;

snapshot.data[index].affiliations.deptId == 1 ?
Text(snapshot.data[index].affiliations.id.toString()) 
: Text("") 

或者您可以从您的数据中创建一个新列表。举个例子:

var filteredList = snapshot.data.where((i) => i.affiliations.deptId == 1).toList();

【讨论】:

在这种情况下,我没有使用列表视图。所以我没有项目的索引。我可以使用 for 循环并比较并添加到列表中,但我正在寻找更清洁的解决方案。就像使用 snapshot.data.data.where 子句一样。此解决方案不起作用,因为 affiliations 本身是一个数组,并且没有将索引传递给 affliations,它不起作用。 我认为在没有循环的情况下解决此问题的唯一方法是在服务器端进行过滤,例如类似于 firebase 或 firestore equalTo() 查询方法的方法,但我认为这不是您的选择,或者你可以在未来的函数中尝试一个循环,..

以上是关于在flutter中过滤json数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 dart/flutter 中提取 JSON 子数据

Flutter:从 json 列表中获取数据

在flutter项目中列出本地json数据

在 Flutter 中显示 JSON 数据

在flutter中获取JSON数据返回NULL

在 Flutter 中动态显示数据表布局中的 JSON 数据