如果一个项目有大量的Map和List,那么日志中将大量出现Map和List的相关信息
但是,当出现奇怪的问题时,我们必须要还原现场,那么就需要将日志中的Map,List进行String to Object的转换目前比较流行的Jackson(FasterXML)是针对JOSN转化为java对象,需要将Map.toString, List.toString转化为标准的JOSN才行。我没有找到一个更好的解决办法
暂时通过正则表达式,进行处理。见多识广的CSDN大神们,帮我参谋参谋。现在是否有一个比较现成的工具能解决如上问题?还是鼓励我自己写个方法来嫁接桥梁?还是果断重写HashMap,做一个JOSNMap?

解决方案 »

  1.   

    自己写一个Util类吧,通过遍历Map、List,转化为Json的String,正方向和反方向分别写一个方法就可以了,也不难,何必找呢?
      

  2.   

    用JSONObject和JSONArray,非常适合你这个场景
      

  3.   

    楼主可以尝试使用Json-Simple类库,该类类库中的JSONObject可以直接加入Map以及JSONArray直接加入List,并且可以通过toString将JSON实例转为JSON字符串或者通过Parser将字符串转为JSON实例。
    如果楼主想要自己实现,就需要遍历你的Map、List,然后一个一个格式化输出你的字符串,其实如果Map或者List的格式固定,只要是格式化的文件都可以,不一定需要转成JSON,只要看着方便就可以。
      

  4.   

    我想。楼主应该是为了在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方法包装到一个工具类中,这个就需要你根据具体的业务环境进行取舍了。