Java在Map轉(zhuǎn)Json字符串時出現(xiàn)"\"轉(zhuǎn)義字符的解決辦法
項目中出現(xiàn)了這樣一個問題,當一個Map被轉(zhuǎn)成Json字符串后,由于業(yè)務需求,會將Map轉(zhuǎn)為JsonObject,添加元素后,又轉(zhuǎn)成Json字符串,最后再被包裝到另一個Map里,被轉(zhuǎn)成Json字符串發(fā)送給APP端,這個時候APP端反應結果中帶有“\”轉(zhuǎn)義字符,無法解析。
簡化一下問題
當一個Map被轉(zhuǎn)成Json字符串后,被添加到另一個Map中,如果這個新的Map需要轉(zhuǎn)成Json字符串格式,那么轉(zhuǎn)化后,內(nèi)部的這個Map轉(zhuǎn)成的Json字符串,都會被加上“\”轉(zhuǎn)義字符。
簡單的模擬一下
public static void main(String[] args) { HashMap<String, Object> param = new HashMap<>(); param.put("userId", 66666); param.put("username", "XXXX"); HashMap<String, String> pushMap = new HashMap<>(); pushMap.put("testKey01", "value01"); pushMap.put("testKey02", "value02"); param.put("pushJson", JSON.toJSONString(pushMap)); String pushJson = JSON.toJSONString(param); System.out.println(pushJson); }
格式化一下結果:
{
"pushJson":
"{\"testKey01\":\"value01\",\"testKey02\":\"value02\"}",
"userId":66666,
"username":"XXXX"
}
延伸測試一下,如果用JSONObject轉(zhuǎn)Json字符串會不會有問題:
public static void main(String[] args) { HashMap<String, Object> param = new HashMap<>(); param.put("userId", 66666); param.put("username", "XXXX"); // HashMap<String, String> pushMap = new HashMap<>(); // pushMap.put("testKey01", "value01"); // pushMap.put("testKey02", "value02"); JSONObject pushObject = new JSONObject(); pushObject.put("testKey01", "value01"); pushObject.put("testKey02", "value02"); param.put("pushJson", pushObject.toJSONString()); String pushJson = JSON.toJSONString(param); System.out.println(pushJson); }
格式化一下結果:
{
"pushJson":
"{\"testKey01\":\"value01\",\"testKey02\":\"value02\"}",
"userId":66666,
"username":"XXXX"
}
用原本的Map和JSONObject:
public static void main(String[] args) { HashMap<String, Object> param = new HashMap<>(); param.put("userId", 66666); param.put("username", "XXXX"); HashMap<String, String> pushMap = new HashMap<>(); pushMap.put("testKey01", "value01"); pushMap.put("testKey02", "value02"); JSONObject pushObject = new JSONObject(); pushObject.put("testKey01", "value01"); pushObject.put("testKey02", "value02"); param.put("pushJson", pushMap); String pushJson1 = JSON.toJSONString(param); System.out.println(pushJson1); param.put("pushJson", pushObject); String pushJson2 = JSON.toJSONString(param); System.out.println(pushJson2); }
結果:
{"pushJson":{"testKey01":"value01","testKey02":"value02"},"userId":66666,"username":"XXXX"}
{"pushJson":{"testKey01":"value01","testKey02":"value02"},"userId":66666,"username":"XXXX"}
這樣就不帶轉(zhuǎn)義字符了
而項目中,我是采用將JSON字符串轉(zhuǎn)回Map,然后添加到新的Map中,再轉(zhuǎn)成JSON字符串的方式解決這個問題的:
HashMap<String, Object> pushApp = new HashMap<>(); pushApp.put("userId", userList); pushApp.put("pushType", pushType); pushApp.put("pushJson", JSON.parseObject(message, HashMap.class)); String pushJson = JSON.toJSONString(pushApp);
當然上面帶“\”轉(zhuǎn)義字符的結果也是有辦法解析的:
public static void main(String[] args) { HashMap<String, Object> param = new HashMap<>(); param.put("userId", 66666); param.put("username", "XXXX"); HashMap<String, String> pushMap = new HashMap<>(); pushMap.put("testKey01", "value01"); pushMap.put("testKey02", "value02"); param.put("pushJson", JSON.toJSONString(pushMap)); String pushJson = JSON.toJSONString(param); System.out.println(pushJson); JSONObject jsonObject = JSONObject.parseObject(pushJson); JSONObject jsonData = jsonObject.getJSONObject("pushJson"); System.out.println("pushJson: " + jsonData); String value1 = jsonData.getString("testKey01"); System.out.println("key: testKey01 value: " + value1); }
結果:
{"pushJson":"{\"testKey01\":\"value01\",\"testKey02\":\"value02\"}","userId":66666,"username":"XXXX"}
pushJson: {"testKey01":"value01","testKey02":"value02"}
key: testKey01 value: value01
2019-09-12
HashMap jsonMap = JSON.parseObject(pushJson,HashMap.class); String resultJson = String.valueOf(jsonMap.get("pushJson")); System.out.println(resultJson);
反解析的時候,還是可以正常解析出來,不需要轉(zhuǎn)成jsonObject也可以
{"pushJson":"{\"testKey01\":\"value01\",\"testKey02\":\"value02\"}","userId":66666,"username":"XXXX"}
{"testKey01":"value01","testKey02":"value02"}
到此這篇關于Java在Map轉(zhuǎn)Json字符串時出現(xiàn)"\"轉(zhuǎn)義字符的解決辦法的文章就介紹到這了,更多相關Java Map轉(zhuǎn)Json內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于spring?@Cacheable?注解的spel表達式解析執(zhí)行邏輯
這篇文章主要介紹了spring?@Cacheable?注解的spel表達式解析執(zhí)行邏輯,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Elasticsearch中FST與前綴搜索應用實戰(zhàn)解析
這篇文章主要為大家介紹了Elasticsearch中FST與前綴搜索應用實戰(zhàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08