我正在使用toString()方法将地图转换为字符串。有没有办法将字符串转换回地图?

时间:2017-08-01 02:46:22

标签: java string hashmap maps

Map<String,Object> inputMap=new HashMap<String,Object>();

    inputMap.put("a","abc");
    inputMap.put("b","bcd");
    inputMap.put("c","cde");

 HashMap<String,String> subMap=new HashMap<String,String>();
   subMap.put("x","xyz");
    subMap.put("z","klm")

    inputMap.put("d",subMap);




String output=inputMap.toString();
System.out.println(output);


{a=abc,b=bcd,c=cde,d={x=xyz,z=klm}}

输出为:{a = abc,b = bcd,c = cde,d = {x = xyz,z = klm}} ;

如何将输出转换回地图

提前致谢。

2 个答案:

答案 0 :(得分:1)

  

有没有办法可以将字符串转换回地图?

一般来说,不是。

  1. Map<K,V>.toString()实施依赖于K.toString()V.toString()实施。这些是不可逆的,这意味着Map实现也不能。

  2. 即使在Map<String,String>情况下,渲染的地图也不会使用任何形式的转义来处理边缘情况......比如包含逗号,等号或大括号的键或值

  3. 在受限制的情况下 1 ,您可以实现自己的解析器,或者您可以使用此处描述的方法之一:

    但是,如果您还需要转换是可逆的,那么使用toString()是一个不好的想法。 toString()方法合同及其实现不是为此目的而设计的。它们主要用于调试。

    1 - 例如,如果您认为KVString,则没有null个键或值,也不会包含尴尬的人物。

    2 - 注意:使用split等的简单解决方案通常不会处理嵌套地图。

答案 1 :(得分:0)

没有预定义的Java方法但您可以使用自己的逻辑进行编码。 我在这里分享我的工作实例。 您可以根据需要更改代码

  String output="{a=abc,b=bcd,c=cde,d={x=xyz,z=klm}}";
    if(output.indexOf("{")==0 && output.lastIndexOf("}")==output.length()-1) {
            output=output.substring(1, output.length()-1);
        HashMap<String, String> convertedMap=convert(output);
        for (HashMap.Entry<String, String> value:convertedMap.entrySet()) {
            if(value.getValue().indexOf("{")==0 && value.getValue().lastIndexOf("}")==value.getValue().length()-1) {
               String valueWithBracket=value.getValue();
               convertedMap.remove(value);
               convertedMap=convert(valueWithBracket);
            }
        }
    }

  public static HashMap<String, String> convert(String str) {
    HashMap<String, String> map = new HashMap<String, String>();
        String[] tokens = str.split(",(?![^{)]*\\})");
    for (String token: tokens) {
       String[] val=token.split("=(?![^{)]*\\})");
        for (int i=0;i<val.length;i=i+2) {
            map.put(val[i], val[i+1]);
        }
    }
        return map;
}
public static HashMap<String, String> removeBracketAndConvert(String str){
    if(str.indexOf("{")==0 && str.lastIndexOf("}")==str.length()-1) {
        str=str.substring(1, str.length()-1);
        return convert(str);
    }
    return convert(str);
}