Convert HashMap.toString() back to HashMap in Java

后端 未结 12 1686
执念已碎
执念已碎 2020-12-14 00:35

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 t

相关标签:
12条回答
  • 2020-12-14 01:07

    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.

    0 讨论(0)
  • 2020-12-14 01:08

    What did you try?

    objectOutputStream.writeObject(hashMap);
    

    should work just fine, providing that all the objects in the hashMap implement Serializable.

    0 讨论(0)
  • 2020-12-14 01:10

    Using ByteStream can convert the String but it can encounter OutOfMemory exception in case of large Strings. Baeldung provides some nice solutions in his pot here : https://www.baeldung.com/java-map-to-string-conversion

    Using StringBuilder :

    public String convertWithIteration(Map<Integer, ?> map) {
    StringBuilder mapAsString = new StringBuilder("{");
    for (Integer key : map.keySet()) {
        mapAsString.append(key + "=" + map.get(key) + ", ");
    }
    mapAsString.delete(mapAsString.length()-2, mapAsString.length()).append("}");
    return mapAsString.toString(); }
    

    Please note that lambdas are only available at language level 8 and above Using Stream :

    public String convertWithStream(Map<Integer, ?> map) {
    String mapAsString = map.keySet().stream()
      .map(key -> key + "=" + map.get(key))
      .collect(Collectors.joining(", ", "{", "}"));
    return mapAsString; }
    

    Converting String Back to Map using Stream :

    public Map<String, String> convertWithStream(String mapAsString) {
    Map<String, String> map = Arrays.stream(mapAsString.split(","))
      .map(entry -> entry.split("="))
      .collect(Collectors.toMap(entry -> entry[0], entry -> entry[1]));
    return map; }
    
    0 讨论(0)
  • 2020-12-14 01:11

    It is possible to rebuild a collection out of its string presentation but it will not work if the elements of the collection don't override their own toString method.

    Therefore it's much safer and easier to use third party library like XStream which streams objects in human readable XML.

    0 讨论(0)
  • 2020-12-14 01:12

    This may be inefficient and indirect. But

        String mapString = "someMap.toString()";
        new HashMap<>(net.sf.json.JSONObject.fromObject(mapString));
    

    should work !!!

    0 讨论(0)
  • 2020-12-14 01:16

    Are you restricted to use only HashMap ??

    Why can't it be so much flexible JSONObject you can do a lot with it.

    You can convert String jsonString to JSONObject jsonObj

    JSONObject jsonObj = new JSONObject(jsonString);
    Iterator it = jsonObj.keys();
    
    while(it.hasNext())
    {
        String key = it.next().toString();
        String value = jsonObj.get(key).toString();
    }
    
    0 讨论(0)
提交回复
热议问题