web-dev-qa-db-fra.com

Reconvertir HashMap.toString () en HashMap en Java

J'ai mis une paire clé-valeur dans une Java HashMap et l'a convertie en une String à l'aide de la méthode toString().

Est-il possible de reconvertir cette représentation String en un objet HashMap et de récupérer la valeur avec la clé correspondante?

Merci

25
Sameek Mishra

L'approche toString() repose sur la mise en œuvre de toString() et peut entraîner des pertes dans la plupart des cas.

Il ne peut y avoir de solution sans perte ici. mais un meilleur serait d'utiliser la sérialisation d'objet 

sérialiser un objet en chaîne

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());
}

désérialiser Chaîne retourne à l'objet

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;
}

Ici, si l’objet utilisateur a des champs qui sont transitoires, ils seront perdus dans le processus.


ancienne réponse


Une fois que vous avez converti HashMap en chaîne en utilisant toString (); Ce n'est pas que vous puissiez le reconvertir en Hashmap à partir de cette chaîne, c'est juste sa représentation en chaîne. 

Vous pouvez soit passer la référence à HashMap à la méthode, soit la sérialiser 

Voici la description de toString () toString ()
Here est l'exemple de code avec une explication pour la sérialisation. 

et passer hashMap à method en tant qu'arg. 

public void sayHello(Map m){

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

Cela fonctionnera si toString () contient toutes les données nécessaires pour restaurer l'objet. Par exemple, cela fonctionnera pour la carte des chaînes (où chaîne est utilisée comme clé et valeur):

// 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());
}

Cela fonctionne bien que je ne comprenne vraiment pas pourquoi avez-vous besoin de cela.

19
AlexR

j'ai converti HashMap en String en utilisant la méthode toString () et passez à l'autre méthode qui prend un String et convertissez cette chaîne en HashMap objet

C’est un très, très mauvais moyen de faire circuler un HashMap. 

En théorie, cela peut fonctionner, mais il y a beaucoup trop de choses qui peuvent mal tourner (et cela donnera de très mauvais résultats). Évidemment, dans votre cas, quelque chose ne va pas. Nous ne pouvons pas dire quoi sans voir votre code.

Mais une solution bien meilleure consisterait à changer cette "autre méthode" afin qu'elle ne prenne tout simplement qu'un paramètre HashMap plutôt qu'une représentation sous forme de chaîne.

5
Michael Borgwardt

vous ne pouvez pas le faire directement mais je l’ai fait de façon folle comme ci-dessous ...

L'idée de base est que, tout d'abord, vous devez convertir HashMap String en Json, puis vous pouvez désérialiser Json en utilisant Gson/Genson, etc. dans HashMap.

@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;
}

la mise en oeuvre...

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);
3
Muhammad Suleman

Qu'as-tu essayé?

objectOutputStream.writeObject(hashMap);

devrait fonctionner correctement, à condition que tous les objets de hashMap implémentent Serializable.

3
djna

Vous ne pouvez pas revenir d'une chaîne à un objet. Donc, vous devrez faire ceci:

HashMap<K, V> map = new HashMap<K, V>();

//Write:
OutputStream os = new FileOutputStream(fileName.ser);
ObjectOutput oo = new ObjectOutputStream(os);
oo.writeObject(map);
oo.close();

//Read:
InputStream is = new FileInputStream(fileName.ser);
ObjectInput oi = new ObjectInputStream(is);
HashMap<K, V> newMap = oi.readObject();
oi.close();
3
zengr

Êtes-vous limité à utiliser uniquement HashMap ??

Pourquoi ne peut-il pas être aussi flexible JSONObject vous pouvez faire beaucoup avec cela.

Vous pouvez convertir String jsonString en 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();
}
2

Cela peut être inefficace et indirect. Mais

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

devrait marcher !!!

0
Akash EJ

Il est possible de reconstruire une collection à partir de sa présentation sous forme de chaîne, mais cela ne fonctionnera pas si les éléments de la collection ne remplacent pas leur propre méthode toString.

Par conséquent, il est beaucoup plus sûr et facile d’utiliser une bibliothèque tierce telle que XStream qui diffuse des objets en XML lisible par l’homme.

0
Boris Pavlović

J'espère que vous devez réellement obtenir la valeur de string en transmettant la clé hashmap. Si tel est le cas, il n'est pas nécessaire de le reconvertir en Hashmap. Utilisez la méthode suivante et vous pourrez obtenir la valeur comme si elle avait été extraite de Hashmap même. 

String string = hash.toString();
String result = getValueFromStringOfHashMap(string, "my_key");

/**
 * To get a value from string of hashmap by passing key that existed in Hashmap before converting to String.
 * Sample string: {fld_category=Principal category, test=test 1, fld_categoryID=1}
 *
 * @param string
 * @param key
 * @return value
 */
public static String getValueFromStringOfHashMap(String string, String key) {


    int start_index = string.indexOf(key) + key.length() + 1;
    int end_index = string.indexOf(",", start_index);
    if (end_index == -1) { // because last key value pair doesn't have trailing comma (,)
        end_index = string.indexOf("}");
    }
    String value = string.substring(start_index, end_index);

    return value;
}

Fait le travail pour moi. 

0
Ayush Goyal