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;
}
我有一个嵌套的 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;
}