com.fasterxml.jackson.databind.e

2021-07-01  本文已影响0人  尘埃里的玄

这个错误看的一开始很迷,为啥无法序列化,我一开始以为JSONObject无法序列化,没有实现Serializable接口,最后后发现实现了的这个接口,奇怪

@GetMapping("/getList")
public Objcet getRoute(){
        String body = HttpRequest.post("http://192.168.7.151:9090/plat/auth/oauth/token").form("username", "admin")
                .form("password", "123").form("validateCode", "0").form("grant_type", "password")
                .form("client_id", "web").form("client_secret", "123").execute().body();
        System.out.println(body);
        JSONObject jsonObject = new JSONObject(body);
        String access_token = (String)jsonObject.get("access_token");
        System.out.println(access_token);

        String body1 = HttpRequest.get("http://192.168.7.219:9000/plat/auth/subsystem/getModule?token=ed3b0701-49af-4e9d-8590-2d9b384ccb5d&projectCode=6000").execute().body();
        System.out.println(body1);
        JSONObject routerListJson = new JSONObject(body1);
        Object data = routerListJson.get("data");
        JSONObject jsonObject1 = new JSONObject(data);
        Object powerInfo = jsonObject1.get("powerInfo");
        JSONArray objects = new JSONArray(powerInfo);
        System.out.println(objects);
return objects;
}

问题分析

Hutool会使用JSONNull来表示空值,而SpringBoot默认使用的序列化是Jackson,在接口调用过程中使用了Map,直接传入了Hutool的JSONObject,而该Map存在空值,所以存在JSONNull,最终导致错误。

总结

在使用JSON序列化工具的时候,尽量不要混合使用,即使存在多个JSON工具,也不把一个JSON工具的JSON对象直接用另一个JSON工具来处理,因为每个JSON工具都有自己的对JSON的处理,包括一些优化,如果混着用就会出问题,所以,在使用JSON工具处理JSON的时候不要混着使用多种JSON

吐槽

这里吐槽下Hutool,null值处理的时候要小心,非空判断用JSONObject.isNull,不要自行处理

解决办法:换为 com.alibaba.fastjson.JSONObject;


    @GetMapping("/getList")
    public Object getRouterList(){
        //拿到能源监管平台的access token
        StringBuilder builder1 = new StringBuilder(baseThirdUrl);
        String s1 = builder1.append("/plat/auth/oauth/token").toString();
        String body = HttpRequest.post(s1).form("username", "admin")
                .form("password", "123").form("validateCode", "0").form("grant_type", "password")
                .form("client_id", "web").form("client_secret", "123").execute().body();
        JSONObject jsonObject = JSONObject.parseObject(body);
        String access_token = (String)jsonObject.get("access_token");
        //拿到可视化大屏项目代码为6000的路由json信息
        StringBuilder builder = new StringBuilder(baseThirdUrl);
        String s = builder.append("/plat/auth/subsystem/getModule?token=").append(access_token).append("&projectCode=6000").toString();
        String body1 = HttpRequest.get(s).execute().body();
        JSONObject jsonObject2 = JSONObject.parseObject(body1);
        Object data = jsonObject2.get("data");
        JSONObject dataJSON= (JSONObject)JSONObject.toJSON(data);
        Object powerInfo = dataJSON.get("powerInfo");
        return powerInfo;
    }

上一篇 下一篇

猜你喜欢

热点阅读