fengchao000 2019-12-23
下面代码有问题吗 ?
Map<String, Object> extraMap; // 声明 Boolean isItemIncluded = isItemIncludingTax(extraMap.toString()); private Boolean isItemIncludingTax(String extra) { JSONObject itemExtra = JSONObject.parseObject(extra); return itemExtra.containsKey("tax") && "1".equals(itemExtra.get("tax")); }
写个简单的单测验证下:
public class MapStringParserTest { @Test public void testParse() { Map<String, Object> map = new HashMap<>(); map.put("a", "{\"outer\":1}"); System.out.println(map); JSONObject parsed = JSONObject.parseObject(map.toString()); System.out.println(parsed.getString("a")); } }
输出结果:
{a={"outer":1}} com.alibaba.fastjson.JSONException: expect ':' at 0, actual = at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:290)
抛异常了。
可是,奇怪的是程序运行正常 。? 为什么 ? 猜猜看。
因为有前置依赖。
orderItemFormatBO.setExtraMap(getExtraMap(extra)); protected Map getExtraMap(String extraJson){ if(StringUtils.isNoneEmpty(extraJson)){ try { return JSON.parseObject(extraJson); }catch (Exception e){ logger.error("extra fomat not valid:{}", extraJson, e); } } return null; }
在设置的时候, extraMap 被设置为?JSONObject 对象, 而在调用 toString 的时候,根据多态,调用的是??JSONObject 的多态方法。 这才没出问题。?
public String toString() { return this.toJSONString(); }
好个超距呼应 !?一旦 extraMap 被重新设置为新的 非 JSONObject 的 Map,就一定会出问题。
别侥幸,虽然逃过一劫, 下次,还能幸运避免吗 ?