今天遇到一个诡异的问题,同样的代码在Java程序与Grails程序中得到了不一样的结果。关键代码如下:
private void scanSubMap(int deep, String key, Map<String, Object> object) {
// 在这里记录
ElementItem elementItem = new ElementItem(key, deep);
elementItemList.add(elementItem);
String sheetName = key;
logger.info(String.format("开始扫描处理:%s:", sheetName));
for (String e : object.keySet()) {
try {
Object o = object.get(e);
logger.info("class name:" + o.getClass().getName());
sheetName = key + "." + e;
if (o instanceof JSONObject) {
logger.info("JSONObject" + sheetName);
Map<String, Object> oo = (Map<String, Object>) o;
scanSubMap(deep + 1, sheetName, oo);
} else {
if (o instanceof JSONArray) {
logger.info("JSONArray" + sheetName);
JSONArray jo = (JSONArray) o;
for (int i = 0; i < jo.size(); i++) {
Map<String, Object> item = jo.getJSONObject(i);
String itemName = String.format("%s[%d]", sheetName, i);
scanSubMap(deep, itemName, item);
}
} else {
logger.info("None " + sheetName);
int k = key.lastIndexOf('.');
String sub = key.substring(0, k);
System.out.printf("%s-->%s=%s\n", sub, e, (String) object.get(e));
elementItem.getData().put(e, (String) object.get(e));
}
}
} catch (Exception exception) {
System.out.printf("%s=%s\n", e, (String) object.get(e));
}
}
}
在java程序中执行的输出为:
21:20:46.956 [main] INFO cn.edu.cup.base.ElementProvider - 开始处理:液体管道模拟工程...
21:20:46.957 [main] INFO cn.edu.cup.base.ElementProvider - 开始扫描处理:液体管道模拟工程:
21:20:46.957 [main] INFO cn.edu.cup.base.ElementProvider - class name:com.alibaba.fastjson.JSONObject
21:20:46.957 [main] INFO cn.edu.cup.base.ElementProvider - JSONObject液体管道模拟工程.流量
21:20:46.957 [main] INFO cn.edu.cup.base.ElementProvider - 开始扫描处理:液体管道模拟工程.流量:
21:20:46.957 [main] INFO cn.edu.cup.base.ElementProvider - class name:java.lang.String
21:20:46.957 [main] INFO cn.edu.cup.base.ElementProvider - None 液体管道模拟工程.流量.unit
而在Grails程序中的执行结果为:
2021-02-18 21:48:54.512 INFO --- [ restartedMain] cn.edu.cup.base.ElementProvider : 开始处理:液体管道模拟工程...
2021-02-18 21:48:54.512 INFO --- [ restartedMain] cn.edu.cup.base.ElementProvider : 开始扫描处理:液体管道模拟工程:
2021-02-18 21:48:54.512 INFO --- [ restartedMain] cn.edu.cup.base.ElementProvider : class name:java.util.HashMap
2021-02-18 21:48:54.512 INFO --- [ restartedMain] cn.edu.cup.base.ElementProvider : None 液体管道模拟工程.流量
2021-02-18 21:48:54.527 ERROR --- [ restartedMain] o.s.boot.SpringApplication : Application run failed
哪位大侠能指点一二?
问题解决了!
问题的关键是Grails调用的时候没有加载fastJSON类。于是,就在调用的时候强行调用一下fastJSON就好。代码如下:
System.out.println(JSON.toJSONString(project.getPump().getHead())); // 这是感悟的
ElementProvider elementProvider = new ElementProvider()
elementProvider.scanDataMap(commonProvider.getDataMap())
增加了这一行代码后,相当于加载了JSON对象,于是,类型判断就OK了。