Convert HashMap.toString() back to HashMap in Java

105,516

Solution 1

toString() approach relies on implementation of toString() and it can be lossy in most of the cases.

There cannot be non lossy solution here. but a better one would be to use Object serialization

serialize Object to String

private static String serialize(Serializable o) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(o);
    oos.close();
    return Base64.getEncoder().encodeToString(baos.toByteArray());
}

deserialize String back to Object

private static Object deserialize(String s) throws IOException,
        ClassNotFoundException {
    byte[] data = Base64.getDecoder().decode(s);
    ObjectInputStream ois = new ObjectInputStream(
            new ByteArrayInputStream(data));
    Object o = ois.readObject();
    ois.close();
    return o;
}

Here if the user object has fields which are transient, they will be lost in the process.


old answer


Once you convert HashMap to String using toString(); It's not that you can convert back it to Hashmap from that String, Its just its String representation.

You can either pass the reference to HashMap to method or you can serialize it

Here is the description for toString() toString()
Here is the sample code with explanation for Serialization.

and to pass hashMap to method as arg.

public void sayHello(Map m){

}
//calling block  
Map  hm = new HashMap();
sayHello(hm);

Solution 2

It will work if toString() contains all data needed to restore the object. For example it will work for map of strings (where string is used as key and value):

// create map
Map<String, String> map = new HashMap<String, String>();
// populate the map

// create string representation
String str = map.toString();

// use properties to restore the map
Properties props = new Properties();
props.load(new StringReader(str.substring(1, str.length() - 1).replace(", ", "\n")));       
Map<String, String> map2 = new HashMap<String, String>();
for (Map.Entry<Object, Object> e : props.entrySet()) {
    map2.put((String)e.getKey(), (String)e.getValue());
}

This works although I really do not understand why do you need this.

Solution 3

you cannot do this directly but i did this in a crazy way as below...

The basic idea is that, 1st you need to convert HashMap String into Json then you can deserialize Json using Gson/Genson etc into HashMap again.

@SuppressWarnings("unchecked")
private HashMap<String, Object> toHashMap(String s) {
    HashMap<String, Object> map = null;
    try {
        map = new Genson().deserialize(toJson(s), HashMap.class);
    } catch (TransformationException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return map;
}

private String toJson(String s) {
    s = s.substring(0, s.length()).replace("{", "{\"");
    s = s.substring(0, s.length()).replace("}", "\"}");
    s = s.substring(0, s.length()).replace(", ", "\", \"");
    s = s.substring(0, s.length()).replace("=", "\":\"");
    s = s.substring(0, s.length()).replace("\"[", "[");
    s = s.substring(0, s.length()).replace("]\"", "]");
    s = s.substring(0, s.length()).replace("}\", \"{", "}, {");
    return s;
}

implementation...

HashMap<String, Object> map = new HashMap<String, Object>();
map.put("Name", "Suleman");
map.put("Country", "Pakistan");
String s = map.toString();
HashMap<String, Object> newMap = toHashMap(s);
System.out.println(newMap);

Solution 4

i converted HashMap into an String using toString() method and pass to the another method that take an String and convert this String into HashMap object

This is a very, very bad way to pass around a HashMap.

It can theoretically work, but there's just way too much that can go wrong (and it will perform very badly). Obviously, in your case something does go wrong. We can't say what without seeing your code.

But a much better solution would be to change that "another method" so that it just takes a HashMap as parameter rather than a String representation of one.

Solution 5

You can make use of Google's "GSON" open-source Java library for this,

Example input (Map.toString) : {name=Bane, id=20}

To Insert again in to HashMap you can use below code:

yourMap = new Gson().fromJson(yourString, HashMap.class);

That's it Enjoy.

(In Jackson Library mapper It will produce exception "expecting double-quote to start field name")

Share:
105,516
Sameek Mishra
Author by

Sameek Mishra

Updated on January 15, 2020

Comments

  • Sameek Mishra
    Sameek Mishra over 4 years

    I put a key-value pair in a Java HashMap and converted it to a String using the toString() method.

    Is it possible to convert this String representation back to a HashMap object and retrieve the value with its corresponding key?

    Thanks

  • Sameek Mishra
    Sameek Mishra over 13 years
    plz,could you explain this more detail.
  • seyed
    seyed about 12 years
    map.put("k=2", "v=2"); System.out.println(map2.get("k=2"));output is:null
  • TheRealChx101
    TheRealChx101 over 8 years
    I think he means the methods are called at different instances. i.e Instance A serializes the Map to string and instance B must deserialize the string into a Map object.
  • We are Borg
    We are Borg almost 6 years
    THis answer makes no sense.
  • jmj
    jmj almost 6 years
    @WeareBorg , thanks for pointing it out, it is 8 year old answer which I wrote as a junior engineer. let me re-write it
  • fuggi
    fuggi over 4 years
    @seyed You need to encode (e.g. URLencode) the keys and values before converting it into string and decode after de-converting the string to avoid any syntax issues.