缺少雙引號的字串轉換成Json物件
阿新 • • 發佈:2019-01-07
今天寫介面遇到一個問題,前端傳過來的密文解密之後,生成的字串中不包含引號,所以直接轉換成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);
**
補充
**
學習使用Java 1.8以後,下面的程式碼也可以搞定了,如下:
String result = Arrays.stream(jsonStr.substring(1, jsonStr.length() - 1).split(","))
.map(v -> "\"" + v.replaceFirst(":", "\":\"") + "\"")
.reduce("{", (a, b) -> a + b + ",")
.toString();
result = result.substring(0, result.length() - 1) + "}";
JSONObject js = JSONObject.fromObject(result);
雖然方法笨一點,但是也達到了效果。
貼出來分享一下,大牛們有沒有更好的實現方法呢?歡迎批評指正。