【问题标题】:Traversing through an array of objects遍历对象数组
【发布时间】:2025-12-18 13:35:01
【问题描述】:
{
"Catalog": {
    "shirts": [
        {
            "id": "93453951-8427394-234723908",
            "name": "Demin Shirt",
            "price": 100.0,
            "category": "Random Category",
            "available": true,
        },
        {
            "id": "93453951-8427394-40325978",
            "name": "Random Shirt",
            "price": 500.0,
            "category": "Random Category",
            "available": true,
        }
    ],
    "Jeans": [
        {
            "id": "4802345-348579-5983452-23423",
            "name": "Bare Denim Jeans",
            "price": 2000.0,
            "category": "Some Category",
            "available": true,
        },
        {
            "id": "143682137-3481293-239842",
            "name": "Levis jeans",
            "price": 1000.0,
            "category": "Some Category",
            "available": true,
       }
    ]
}

}

如何遍历这个对象数组,以便能够在衬衫类别下显示所有不同类型的衬衫,在牛仔裤标题下显示所有牛仔裤。

类似这样的:

  • 衬衫
    • 牛仔衬衫。
    • 随机衬衫
  • 牛仔裤
    • 裸色牛仔裤
    • 李维斯牛仔裤

【问题讨论】:

    标签: loops object flutter dart


    【解决方案1】:

    通用解决方案

    这是一个对象,而不是一个列表,所以你不能把它插入一个循环中。如果你想遍历所有的值和子值,你将不得不递归地进行。

    void recurseObject(dynamic value) {
      if (value is List) {
        // value is a list, iterate over its children
        for (var child in value) {
          recurseObject(object);
        }
      } else if (value is Map) {
        // value is an object, iterate over its keys and recurse the corresponding values
        for (var key in object.keys) {
          print(key);
          recurseObject(object[key]);
        }
      } else {
        // value is a primitive, so just print it
        print(value);
      }
    }
    
    

    特定于您的对象

    如果你的对象有一个固定的结构,那么你可以抓住所有你想要的位并设置一些嵌套循环。

    final catalog = rootObj['Catalog'] as Map<String, Dynamic>;
    
    for (var category in catalog.keys) {
      final categoryList = catalog[category] as List<dynamic>;
      print(category);
      for (var value in categoryList) {
        final name = value['name'];
        print(name);
      }
    }
    

    【讨论】:

      【解决方案2】:

      你所拥有的是纯 JSON。您需要先将其转换为 Dart 对象。

      有几种方法可以进行转换。我发现最简单的方法是使用在线转换器,例如这个网站:https://app.quicktype.io/

      将 JSON 转换为对象后,您可以像这样遍历它:

      printCatalog() {
       var catalog =
          Catalog.fromRawJson("Here's where you need to pass in your JSON");
      
       print("Shirts: ");
      
       catalog.shirts.forEach((shirt) {
         print(shirt.name);
       });
      
       print("Jeans: ");
      
       catalog.jeans.forEach((jean) {
         print(jean.name);
       });
      }
      

      【讨论】:

        【解决方案3】:

        只需使用 dart:convert 库和 json.decode。然后在你的 json 中访问你想要的任何东西。 我修复了您的 JSON,因为它没有正确设置,这是完整的解决方案。

        import 'dart:convert';
        
        void main() {
          var jsonstring = '''{
            "Catalog": {
                "shirts": [{
                        "id": "93453951-8427394-234723908",
                        "name": "Demin Shirt",
                        "price": 100.0,
                        "category": "Random Category",
                        "available": "true"
                    },
                    {
                        "id": "93453951-8427394-40325978",
                        "name": "Random Shirt",
                        "price": 500.0,
                        "category": "Random Category",
                        "available": true
                    }
                ],
                "Jeans": [{
                        "id": "4802345-348579-5983452-23423",
                        "name": "Bare Denim Jeans",
                        "price": 2000.0,
                        "category": "Some Category",
                        "available": true
                    },
                    {
                        "id": "143682137-3481293-239842",
                        "name": "Levis jeans",
                        "price": 1000.0,
                        "category": "Some Category",
                        "available": true
                    }
                ]
            }
        }''';
        
          Map<String, dynamic> data = json.decode(jsonstring);
        
          print("--COOL SHIRTS--");
          for (var shirt in data["Catalog"]["shirts"]) {
            print(shirt["name"]);
          }
          print("\n--COOL JEANS--");
          for (var jeans in data["Catalog"]["Jeans"]) {
            print(jeans["name"]);
          }
        }
        

        输出:

        --COOL SHIRTS--
        Demin Shirt
        Random Shirt
        
        --COOL JEANS--
        Bare Denim Jeans
        Levis jeans
        

        【讨论】: