【发布时间】:2018-11-03 20:25:15
【问题描述】:
我在数据库中有一个文件结构,路径和文件名作为列,并希望将它们组合在一起,但不知道该怎么做。这是我目前使用的精简版:
//in this example, list is the returned data
JSONArray jList1 = new JSONArray();
for (int a = 0; a < list.size(); a++){
Object[] fileObj = (Object[])list.get(a);
String folder = (String)fileObj[0];
String filename = (String)fileObj[1];
JSONObject jObj1 = new JSONObject();
jObj1.put("path",folder);
jObj1.put("filename",filename);
jList1.add(jObj1);
}
response.getWriter().write(jList1.toJSONString());
这会将所有内容放入同一个 JSONArray。以下是输出示例:
[
{
path: "/a",
filename: ""
},
{
path: "/a",
filename: "file1.png"
},
{
path: "/a/b",
filename: ""
},
{
path: "/a/b",
filename: "file2.png"
},
{
path: "/a/b",
filename: "file3.png"
},
{
path: "/a/c",
filename: ""
},
{
path: "/a/c",
filename: "file4.jpg",
},
{
path: "/",
filename: "file5.jpg",
},
{
path: "/",
filename: "file6.jpg",
}
]
我想要这样的:
[
{
path: "/a",
filename: ""
files: [
{
path: "/a/b",
filename: ""
files: [
{
path: "/a/b",
filename: "file2.png"
},
{
path: "/a/b",
filename: "file3.png"
}
]
},
{
path: "/a/c",
filename: ""
files: [
{
path: "/a/c",
filename: "file4.jpg",
}
]
},
{
path: "/a",
filename: "file1.png"
}
]
},
{
path: "/",
filename: "file5.jpg",
},
{
path: "/",
filename: "file6.jpg",
}
]
现在我可以知道确切的级别数来执行此操作,但不确定如何处理树的未知级别数。我为示例取出的每个对象中还有其他属性,这就是为什么我不只是将文件名本身放入数组中。
我忽略了数据库结构,因为我认为它并不真正需要。唯一的问题可能是它的顺序,我有:
order by (CASE WHEN path='/' THEN 1 ELSE 0 END), path, filename
基本上每个级别都有顶部的文件夹和底部的文件。
有人可以让我按照我正在寻找的方式构建 JSON 吗?我知道与以前的记录相比,它必须是某种存储记录,但似乎无法弄清楚如何构建它。我曾考虑对每个目录进行不同的查询,但这会导致对数据库的大量访问,从而导致性能问题。
【问题讨论】:
-
你为什么需要像这样嵌套它们,我觉得任何只有文件路径的条目都是多余的,因为该路径中的任何项目都存在该信息,那就是没有意义 @987654325 @当你有
"/a/b","file2.png"然后你可以从第二项中提取父路径。 -
我需要嵌套它们以获得最终输出。模板像这样嵌套它们以进行显示。我理解你所说的没有这样列出的文件夹,但我知道我在那里是因为该文件夹在对象中有更多信息,如修改日期、文件数量等。为简单起见,我将其删除。
标签: java json arraylist multidimensional-array