这个错误看的一开始很迷,为啥无法序列化,我一开始以为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;
}
网友评论