今天写接口遇到一个问题,前段传过来的密文解密之后,生成的字符串中不包含引号,所以直接转换成Json的时候报错了。网上找了半天,也没发现有什么好的方法去解决,所以就用基础的套路,自己转换字符串。
第一种情况解密之后的字符串是下面这个样子的:
String jsonStr = "{appkey:zkkOpNJ1Jo,adtype:1,appid:33e496d5fec,deviceid:15d994b}";直接JSONObject jsonObject = JSONObject.fromObject(jsonStr)就会报错。如果截取字段,又觉得麻烦,于是就采用了替换的方式,代码如下:
jsonStr = jsonStr.replace("{", "{\""); jsonStr = jsonStr.replace(":", "\":\""); jsonStr = jsonStr.replace(",", "\",\""); jsonStr = jsonStr.replace("}", "\"}");这样就可以给各个每处节点都加上了引号,然后再转换成Json
JSONObject jsonObject = JSONObject.fromObject(jsonStr); System.out.println("转换后:"+jsonObject); 第二种情况当我以为已经搞定的时候,又出现了新的情况,在另一个接口中解密出的字符串如下:
String jsonStr = "{mac:98:3b:16:fe:44:70,men:1761MB,storage:3921.16MB,deviceid:15d994b1}";由于mac中的值中包含有“:”,所以拿第一种方法来解决处理的时候果断报错。想了一会,没有好的想法,就用了笨方法,截取!先以逗号分隔成数组,然后再分别截取数组中第一个分号前后的内容,并用StringBuffer拼接。代码如下:
String jsonStr = "{mac:98:3b:16:fe:44:70,men:1761MB,storage:3921.16MB,deviceid:15d994b1}"; System.out.println("转换前:" + jsonStr); jsonStr = jsonStr.substring(1, jsonStr.length() - 1); String[] strs = jsonStr.split(","); StringBuffer stringBuffer = new StringBuffer("{"); for (int i = 0; i < strs.length; i++) { stringBuffer.append("\"" + strs[i].substring(0, strs[i].indexOf(":")) + "\":\"" + strs[i].substring(strs[i].indexOf(":") + 1) + "\","); System.out.println(strs[i].substring(0, strs[i].indexOf(":")) + " = " + strs[i].substring(strs[i].indexOf(":") + 1)); } stringBuffer.replace(stringBuffer.length() - 1,stringBuffer.length(), "}"); JSONObject jsonObject = JSONObject.fromObject(stringBuffer.toString()); System.out.println("转换后:" + jsonObject);虽然方法笨一点,但是也达到了效果。
贴出来分享一下,大牛们有没有更好的实现方法呢?欢迎批评指正。