疯一样的男子
疯一样的男子
发布于 2021-05-27 / 1 阅读
0
0

使用files读取json文件内容,并把json格式的内容转换成List<Map>对象

一、说明

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数据读取到集合,然后对数据的筛选父级数据,然后再把对应的子级数据添加到父级里面,类似一个菜单一样,其实就是一个简单的树状结构。


评论