如果一個專案有大量的Map和List,那么日志中將大量出現Map和List的相關資訊
但是,當出現奇怪的問題時,我們必須要還原現場,那么就需要將日志中的Map,List進行String to Object的轉換
目前比較流行的Jackson(FasterXML)是針對JOSN轉化為java物件,需要將Map.toString, List.toString轉化為標準的JOSN才行。
我沒有找到一個更好的解決辦法
暫時通過正則運算式,進行處理。
見多識廣的CSDN大神們,幫我參謀參謀。現在是否有一個比較現成的工具能解決如上問題?還是鼓勵我自己寫個方法來嫁接橋梁?還是果斷重寫HashMap,做一個JOSNMap?

uj5u.com熱心網友回復:
自己寫一個Util類吧,通過遍歷Map、List,轉化為Json的String,正方向和反方向分別寫一個方法就可以了,也不難,何必找呢?uj5u.com熱心網友回復:
用JSONObject和JSONArray,非常適合你這個場景uj5u.com熱心網友回復:
樓主可以嘗試使用Json-Simple類別庫,該類類別庫中的JSONObject可以直接加入Map以及JSONArray直接加入List,并且可以通過toString將JSON實體轉為JSON字串或者通過Parser將字串轉為JSON實體。如果樓主想要自己實作,就需要遍歷你的Map、List,然后一個一個格式化輸出你的字串,其實如果Map或者List的格式固定,只要是格式化的檔案都可以,不一定需要轉成JSON,只要看著方便就可以。
uj5u.com熱心網友回復:
我想。樓主應該是為了在Logger里輸出HashMap的Json表示形式而不是傳統的toString形式,以求可以“恢復現場”吧。具體的解釋就不說了,給樓主寫個例子:
//JsonMap實作
public static class JsonMap<K, V> extends HashMap<K, V> {
private static final long serialVersionUID = -4083915643878380063L;
//從Json構造Map
public static <K,V> JsonMap<K, V> fromJson(String json){
@SuppressWarnings("unchecked")
JsonMap<K, V> map = JSON.parseObject(json, JsonMap.class);
return map;
}
//重寫toString方法
@Override
public String toString(){
return JSON.toJSONString(this);
}
}
//測驗
public static void main(String[] args) {
JsonMap<String, String> jmap = new JsonMap<String, String>();
jmap.put("hello", "world");
jmap.put("你好", "世界");
String jmapString = jmap.toString();
System.out.println(jmap); //此處會自動呼叫toString()
jmap = JsonMap.fromJson(jmapString);
System.out.println(jmap.get("hello"));
}
這樣,只需要把程式里需要恢復現場的HashMap改成JsonMap,然后修改恢復邏輯即可。
當然,你也可以將toString于fromJson方法包裝到一個工具類中,這個就需要你根據具體的業務環境進行取舍了。
uj5u.com熱心網友回復:
使用正則運算式,把map物件toString后的字串轉成json格式就可以了
Map test = new HashMap();
test.put("a", "1");
test.put("b", "2");
test.put("c", "3");
String testStr = test.toString();
System.out.println(testStr);
String jsonStr = testStr.replaceAll("([^,\\{\\s]*)=([^,\\]\\}]*)", "\"$1\":\"$2\"");
System.out.println(jsonStr);
System.out.println(new ObjectMapper().readValue(jsonStr, HashMap.class));
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/46104.html
標籤:Java SE
