Flutter json 文件夹结构和搜索层次结构

Flutter json folder structure and search hierachy

我有一个嵌套的 json 文件。

[
  {
    "name": "Purchases of goods",
    "key": "f1",
    "type":  "folder",
    "owner": "admin",
    "subfolders": [
      {
        "name": "Invoice 1",
        "key": "f28",
        "type":  "file",
        "owner": "user",
        "filename": "inv1.png"
      },
      {
        "name": "Invoice 2",
        "key": "f29",
        "type":  "file",
        "owner": "user",
        "filename": "inv2.jpg"
      },
      {
        "name": "Invoice 3",
        "key": "f30",
        "type":  "file",
        "owner": "user",
        "filename": "inv3.png"
      },
      {
        "name": "Invoice 4",
        "key": "f31",
        "type":  "file",
        "owner": "user",
        "filename": "inv4.png"
      },
      {
        "name": "Invoice 5",
        "key": "f32",
        "type":  "file",
        "owner": "user",
        "filename": "inv5.jpg"
      },
      {
        "name": "Invoice 6",
        "key": "f33",
        "type":  "file",
        "owner": "user",
        "filename": "inv6.png"
      },
      {
        "name": "Invoice 7",
        "key": "f34",
        "type":  "file",
        "owner": "user",
        "filename": "inv7.png"
      }
    ]
  },
  {
    "name": "Staff costs",
    "key": "f2",
    "type":  "folder",
    "owner": "admin",
    "subfolders": [
      {
        "key": "f3",
        "name": "Salaries",
        "type":  "folder",
        "owner": "admin",
        "subfolders": [
          {
            "name": "Invoice 1",
            "key": "f35",
            "type":  "file",
            "owner": "user",
            "filename": "inv1.png"
          },
          {
            "name": "Invoice 2",
            "key": "f36",
            "type":  "file",
            "owner": "user",
            "filename": "inv2.jpg"
          },
          {
            "name": "Invoice 3",
            "key": "f37",
            "type":  "file",
            "owner": "user",
            "filename": "inv3.png"
          },
          {
            "name": "Invoice 4",
            "key": "f38",
            "type":  "file",
            "owner": "user",
            "filename": "inv4.png"
          },
          {
            "name": "Invoice 5",
            "key": "f39",
            "type":  "file",
            "owner": "user",
            "filename": "inv5.jpg"
          },
          {
            "name": "Invoice 6",
            "key": "f40",
            "type":  "file",
            "owner": "user",
            "filename": "inv6.png"
          },
          {
            "name": "Invoice 7",
            "key": "f41",
            "type":  "file",
            "owner": "user",
            "filename": "inv7.png"
          }
        ]
      },
      {
        "key": "f4",
        "name": "Social insurance benefits",
        "type":  "folder",
        "owner": "admin"
      },
      {
        "key": "f5",
        "name": "AVS, AI, APG, unemployment insurance",
        "type":  "folder",
        "owner": "admin"
      },
      {
        "key": "f6",
        "name": "Occupational pension",
        "type":  "folder",
        "owner": "admin"
      },
      {
        "key": "f7",
        "name": "Accident insurance",
        "type":  "folder",
        "owner": "admin"
      },
      {
        "key": "f8",
        "name": "Daily allowance insurance in the event of illness",
        "type":  "folder",
        "owner": "admin"
      },
      {
        "key": "f9",
        "name": "Temporary employees",
        "type":  "folder",
        "owner": "admin"
      }
    ]
  },
  {
    "name": "RENTS",
    "key": "f10",
    "type":  "folder",
    "owner": "admin"
  },
  {
    "name": "Vehicle costs",
    "key": "f11",
    "type":  "folder",
    "owner": "admin",
    "subfolders": [
      {
        "key": "f12",
        "name": "Repair, service and cleaning",
        "type":  "folder",
        "owner": "admin"
      },
      {
        "key": "f13",
        "name": "Fuels",
        "type":  "folder",
        "owner": "admin"
      },
      {
        "key": "f14",
        "name": "Insurance and taxes",
        "type":  "folder",
        "owner": "admin"
      }
    ]
  },
  {
    "name": "INSURANCE",
    "key": "f15",
    "type":  "folder",
    "owner": "admin"
  },
  {
    "name": "ADMINISTRATIVE CHARGES",
    "key": "f16",
    "type":  "folder",
    "owner": "admin",
    "subfolders": [
      {
        "key": "f17",
        "name": "Office supplies",
        "type":  "folder",
        "owner": "admin"
      },
      {
        "key": "f18",
        "name": "Phone",
        "type":  "folder",
        "owner": "admin"
      },
      {
        "key": "f19",
        "name": "Internet",
        "type":  "folder",
        "owner": "admin"
      }
    ]
  },
  {
    "name": "AMORTIZATION",
    "key": "f20",
    "type":  "folder",
    "owner": "admin",
    "subfolders": [
      {
        "key": "f21",
        "name": "Machine and tool depreciation",
        "type":  "folder",
        "owner": "admin"
      },
      {
        "key": "f22",
        "name": "Furniture depreciation",
        "type":  "folder",
        "owner": "admin"
      },
      {
        "key": "f23",
        "name": "Depreciation of office machines, IT",
        "type":  "folder",
        "owner": "admin"
      },
      {
        "key": "f24",
        "name": "Vehicle depreciation",
        "type":  "folder",
        "owner": "admin"
      }
    ]
  },
  {
    "name": "Computers",
    "key": "f25",
    "type":  "folder",
    "owner": "user",
    "subfolders": [
      {
        "name": "Invoice one",
        "key": "f26",
        "type":  "file",
        "owner": "user",
        "filename": "inv1.png"
      },
      {
        "name": "Invoice two",
        "key": "f27",
        "type":  "file",
        "owner": "user",
        "filename": "inv2.jpg"
      }
    ]
  },
  {
    "name": "Invoice one",
    "key": "f26",
    "type":  "file",
    "owner": "user",
    "filename": "inv1.png"
  },
  {
    "name": "Invoice two",
    "key": "f27",
    "type":  "file",
    "owner": "user",
    "filename": "inv2.jpg"
  }
]

我已经使用 flutter 网格视图将这些文件列出到应用程序中。它工作正常。现在我在搜索 json.

时遇到问题

例如:

如果您搜索“键”:“f35”, 它属于 Staff costs -> Salaries -> Invoice 1 这是我想要的输出。我想找到 json 的父层次结构。我不确定如何实施。如果我搜索键

,我只想打印值
loadJson() async{
    String data = await rootBundle.loadString('assets/json/expenses/en.json');
    data = data.toString();
    final jsonResult = json.decode(data);
    //print(jsonResult);
    String keyValue = "f1";
    var parentFolders = [];
    var folderPath = '';
    var pathInfo = folderList(jsonResult, parentFolders, keyValue, folderPath);
  }

folderList(List folders, parentFolders, keyValue, folderPath) {
    for (var i = 0; i < folders.length; i++)
    {
       if(folders[i].containsKey("subfolders")) {
         parentFolders.add(folders[i]["name"]);
         if(folders[i]["key"]==keyValue) {
           // print("match 1");
           // print(parentFolders.join(' / '));
           folderPath = parentFolders.join(' / ');
           return folderPath;
         }
         folderPath = folderList(folders[i]["subfolders"], parentFolders, keyValue, folderPath);
         parentFolders.removeLast();
       }
       else{
         if(folders[i]["key"]==keyValue) {
           // print("match 2");
           // print(parentFolders.join(' / '));
           folderPath = parentFolders.join(' / ');
           return folderPath;
         }
       }
    }
    return folderPath;
  }

您可以像下面这样使用递归函数来实现。

如果项目是文件夹并且有子文件夹,请输入子文件夹并重新搜索。

这是我用代码实现的测试结果。
搜索键序列被打印出来,你可以知道如何找到你找到的键。

这里是我实现你想要的代码。

List<String> findKey(List<Map<String, dynamic>> data, String key) {
  List<String> parent = [];
  
  for (var item in data) {
    print(item['key']);
    print(parent);
    
    if (item['key'] == key) {
      print('founded key: ${item['key']}');
      parent.add(item['name']);
      return parent;
    } else {
      if (item['type'] == 'folder' && item.containsKey('subfolders')) {
        parent.add(item['name']);
        var result = findKey(item['subfolders'], key);
        
        if (result.isNotEmpty) {
          print('inner founded key: ${result}');
          parent += result;
          return parent;
        } else {
          parent.removeLast();
        }
      }
    }
  }
  
  return parent;
}