1. 程式人生 > >缺少雙引號的字串轉換成Json物件

缺少雙引號的字串轉換成Json物件

今天寫介面遇到一個問題,前端傳過來的密文解密之後,生成的字串中不包含引號,所以直接轉換成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);

雖然方法笨一點,但是也達到了效果。
貼出來分享一下,大牛們有沒有更好的實現方法呢?歡迎批評指正。