一、说明
data1.json 与 data2.json的json内容字段说明
code:菜单编号
name:菜单名称
parent:父菜单编号(一级菜单parent为"",二级菜单的parent是父菜单(一级菜单)的编号)
subMenus:子菜单数组(一级菜单所属的二级菜单数组)
将data1.json的内容通过你最熟悉的json库读取到List<Map> list 对象中(推荐使用jackson/gson通过IO流读取),通过遍历将一级菜单添加到List<Map> list_one 中,将二级菜单添加到对应的一级菜单的subMenus字段的数组中
数据
二、data1.json数据如下
[
{
"code": "1",
"name": "菜单1",
"parent": ""
},
{
"code": "2",
"name": "菜单2",
"parent": "1"
},
{
"code": "3",
"name": "菜单3",
"parent": ""
},
{
"code": "4",
"name": "菜单4",
"parent": "1"
},
{
"code": "5",
"name": "菜单5",
"parent": "3"
},
{
"code": "6",
"name": "菜单6",
"parent": "3"
},
{
"code": "7",
"name": "菜单7",
"parent": "1"
},
{
"code": "8",
"name": "菜单8",
"parent": "1"
},
{
"code": "9",
"name": "菜单9",
"parent": ""
}
]
三、data2.json数据如下
[
{
"code": "1",
"name": "菜单1",
"parent": "",
"subMenus": [
{
"code": "2",
"name": "菜单2",
"parent": "1"
},
{
"code": "4",
"name": "菜单4",
"parent": "1"
},
{
"code": "7",
"name": "菜单7",
"parent": "1"
},
{
"code": "8",
"name": "菜单8",
"parent": "1"
}
]
},
{
"code": "3",
"name": "菜单3",
"parent": "",
"subMenus": [
{
"code": "5",
"name": "菜单5",
"parent": "3"
},
{
"code": "6",
"name": "菜单6",
"parent": "3"
}
]
},
{
"code": "9",
"name": "菜单9",
"parent": ""
}
]
四、具体代码如下
package cn.lbj.testdemo20210526;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author YouN
* @date 2021/5/27 10:22
* @Description TODO
*/
public class Test2 {
//执行
public static void main(String[] args) throws IOException {
test();
}
public static void test() throws IOException {
String path = "E:\\YouN\\test\\data1.json";
String jsonFile = readJsonFile(path);
System.out.println(jsonFile);
//1.将data1.json的内容到List<Map> list 对象中
//转换第一种方式
List<Map> maps = JSONObject.parseArray(jsonFile, Map.class);
//转换第二种方式
ObjectMapper objectMapper = new ObjectMapper();
TypeFactory typeFactory = objectMapper.getTypeFactory();
List<Map<String, Object>> someClassList = objectMapper.readValue(jsonFile, typeFactory.constructCollectionType(List.class, Map.class));
System.out.println("转换为对象的数据=" + maps);
System.out.println("转换为对象的数据=" + someClassList);
//2. 通过遍历将一级菜单添加到List<Map> list_one 中
List<Map> list_one = maps.stream().filter(v -> "".equals(v.get("parent"))).collect(Collectors.toList());
System.out.println("list_one一级菜单数据=" + list_one);
//将二级菜单添加到对应的一级菜单的subMenus字段的数组中
list_one.stream().forEach(l -> {
List collect = maps.stream().filter(s ->
l.get("code").equals(s.get("parent"))
).collect(Collectors.toList());
l.put("subMenus", collect);
}
);
System.out.println("树状菜单数据=" + list_one);
}
//使用Files读取json文件
public static String readJsonFile(String fileName) throws IOException {
//代码简洁,效率可能不高,在针对大文件的读取的时候,可能会出现内存不足,导致堆溢出
//String s = new String(Files.readAllBytes(Paths.get(fileName)), StandardCharsets.UTF_8);
//return s;
//使用Files缓存流读取
try {
//Charset.forName("utf-8");
BufferedReader reader = Files.newBufferedReader(Paths.get(fileName), StandardCharsets.UTF_8);
String jsonStr = "";
StringBuffer su = new StringBuffer();
while ((jsonStr = reader.readLine()) != null) {
su.append(jsonStr);
}
return su.toString();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
五、控制台输出部分截图
六、总结
其实就是把data1.json数据转换成data2.json的格式,但是题目题意不是很明确,容易让人搞不懂,简单来说就是把data1.json数据读取到集合,然后对数据的筛选父级数据,然后再把对应的子级数据添加到父级里面,类似一个菜单一样,其实就是一个简单的树状结构。