gson

大佬让我用gson来生成json数据返回给前端。
gson生成的json会自动把为null的K-V给去除。当然也可以设置不忽略null值。
gson还有很多方式来制定返回的json格式。
重新认识一个强大的 Gson - 软件测试技术的文章 - 知乎

业务层代码

public class staticpro {

    public static List<Menus> list = new ArrayList<>();

    public static String buildJson(){

        Menus m = null;
        for (int i=1; i<=10; i++){
            String menuName = null;
            switch (i){
                case 1: menuName="办公";break;
                case 2: menuName="交流";break;
                case 3: menuName="销售";break;
                case 4: menuName="采购";break;
                case 5: menuName="仓储";break;
                case 6: menuName="项目";break;
                case 7: menuName="服务";break;
                case 8: menuName="人事";break;
                case 9: menuName="财务";break;
                case 10: menuName="报表";break;
            }
            m = new Menus(i, menuName, null, 0, 1);
            list.add(m);
        }
        String json = new Gson().toJson(list); // 直接匿名构造
        return json;
    }
}

控制器层代码:发现返回的json数据,会一直重复调用。
是因为业务层的方法每次访问都会list.add。所以json数据会一直重复添加。
想让这个方法只调用一次。
方法1:设置一个全局标记位

@RestController
@RequestMapping("/menus")
public class MenuController {

    @Autowired
    MenuService menuService;

    private static boolean flag = false;
    private static String json;

    @RequestMapping("listPreMenus")
    public String listMenu(){
        if (!flag){
            json = staticpro.buildJson();
            flag = !flag;
        }
        return json;
    }w
}

方法2:重写springboot的run方法,类用Component注解标注,实现CommandLineRunner接口,重写它的run方法。
这样在类加载的时候就会运行指定方法。不用再添加标志位判断是否已经运行过该方法。
springboot启动并执行特定方法 - 简书

@Component
public class staticpro implements CommandLineRunner{

    public static List<Menus> list = new ArrayList<>();
    private static String json;

    public static String buildJson(){
        return json;
    }

    @Override
    public void run(String... args) throws Exception {
        Menus m = null;
        for (int i=1; i<=10; i++){
            String menuName = null;
            switch (i){
                case 1: menuName="办公";break;
                case 2: menuName="交流";break;
                case 3: menuName="销售";break;
                case 4: menuName="采购";break;
                case 5: menuName="仓储";break;
                case 6: menuName="项目";break;
                case 7: menuName="服务";break;
                case 8: menuName="人事";break;
                case 9: menuName="财务";break;
                case 10: menuName="报表";break;
            }
            m = new Menus(i, menuName, null, 0, 1);
            list.add(m);
        }
        json = new Gson().toJson(list);
    }
}

返回的json:

[{"menuId":1,"menuName":"办公","preMenuId":0,"menuType":1},{"menuId":2,"menuName":"交流","preMenuId":0,"menuType":1},{"menuId":3,"menuName":"销售","preMenuId":0,"menuType":1},{"menuId":4,"menuName":"采购","preMenuId":0,"menuType":1},{"menuId":5,"menuName":"仓储","preMenuId":0,"menuType":1},{"menuId":6,"menuName":"项目","preMenuId":0,"menuType":1},{"menuId":7,"menuName":"服务","preMenuId":0,"menuType":1},{"menuId":8,"menuName":"人事","preMenuId":0,"menuType":1},{"menuId":9,"menuName":"财务","preMenuId":0,"menuType":1},{"menuId":10,"menuName":"报表","preMenuId":0,"menuType":1}]

前段解析gson生成的json:

        $.get(menuUrl, function(result){
            $("#headMenuUl").each(function(){
                // var json = eval(result); 第一种实现用eval()函数:计算某个字符串,并执行其中的的 JavaScript 代码。
                var json = JSON.parse(result); // 第二种实现jQuery的parse: 以 JSON 格式接收到数据,将其转换为 JavaScript 对象
                $("#headMenuUl").empty();
                var length = json.length;
                for (var i=0; i<length; i++){ // 对象[i].属性的方式拿值
                    $("#headMenuUl").append("<li class='layui-nav-item' data-id="+ json[i].menuId + "><a href='javascript:;'>"+ json[i].menuName +"</a></li> ")
                }
            })
        })
posted @ 2021-03-17 14:32  张三丰学Java  阅读(349)  评论(0编辑  收藏  举报