前言:此问题网上多数是围绕FastJson做的应对,而JSONObject这块目前没有找到,特此记录下!
业务场景:
APP端上传json数据到服务端,服务端用的JSONObject方式解析,当json串中包含类似xx.00的数据时,用toString方法生成的String类型数据时,里面的xx.00被默认置为xx,又由于MD5加密此字符串生成的密钥与客户端传上来的不相等,导致插入数据失败。
调查原因:
后由调试服务端代码,发现是JSONObject里面就是这么做的:
JSONObject.class中toString()
public String toString() {
if (this.isNullObject()) {
return JSONNull.getInstance().toString();
} else {
try {
Iterator keys = this.keys();
StringBuffer sb = new StringBuffer("{");
while(keys.hasNext()) {
if (sb.length() > 1) {
sb.append(',');
}
Object o = keys.next();
sb.append(JSONUtils.quote(o.toString()));
sb.append(':');
sb.append(JSONUtils.valueToString(this.properties.get(o)));
}
sb.append('}');
return sb.toString();
} catch (Exception var4) {
return null;
}
}
}
JSONObject内数据结构是一个Map,可以看到用到主要工作是在JSONUtils.valueToString(this.properties.get(o)),这个方法里,进入
JSONUtils.class中ValueToString()
public static String valueToString(Object value) {
if (value !