2010-10-18 20 views
22

Puse un par clave-valor en Java HashMap y lo convertí en String usando el método toString().Convertir HashMap.toString() a HashMap en Java

¿Es posible convertir esta representación String de nuevo a un objeto HashMap y recuperar el valor con su clave correspondiente?

Gracias

+0

Mala pregunta, generalmente object-> toString() es una conversión unidireccional. A veces se puede lograr el objeto toString() ->, pero no con todas las clases. Mejor uso objectOutputStream como en alguna respuesta. – iirekm

Respuesta

6

Una vez que convierte HashMap en String usando toString(); No es que puedas convertirlo a Hashmap desde esa Cadena, es solo su representación de Cadena.

Puede pasar la referencia a Hashmap al método o se puede serializar

Aquí está la descripción de toString() toString()
Here es el código de ejemplo con la explicación para la serialización.

y pasar hashMap al método como arg.

public void sayHello(Map m){ 

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

Gracias por responder. –

+0

por favor, ¿podría explicarme este detalle? –

+0

@sam lo actualizó –

3

¿Qué has probado?

objectOutputStream.writeObject(hashMap); 

debería funcionar bien, siempre que todos los objetos en el hashMap implementen Serializable.

+0

gracias por responder, ¿podría explicarme este detalle? –

0

Es posible reconstruir una colección de su presentación de cadena pero no va a funcionar si los elementos de la colección no anulan su propio método toString.

Por lo tanto, es mucho más segura y fácil de usar biblioteca de terceros como XStream que transmite objetos en XML legible para humanos.

3

No puede revertir la cadena a un objeto. Por lo que tendrá que hacer esto:

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

i convertidos HashMap en una cadena utilizando el método toString() y pasar a el otro método que toma una Cadena de y convertir esta cadena en HashMap objeto

Esto es muy, muy malo forma de pasar alrededor de un HashMap.

En teoría, puede funcionar, pero hay demasiadas cosas que pueden salir mal (y funcionarán muy mal). Obviamente, en tu caso, algo sale mal. No podemos decir qué sin ver tu código.

Pero una solución mucho mejor sería cambiar ese "otro método" para que simplemente tome un HashMap como parámetro en lugar de una representación de Cadena de uno.

+2

Creo que quiere decir que se llaman los métodos en diferentes instancias. es decir, la instancia A serializa el 'Map' a la cadena y la instancia B debe deserializar la cadena en un objeto' Map'. – TheRealChx101

16

Funcionará si toString() contiene todos los datos necesarios para restaurar el objeto.Por ejemplo, se va a trabajar para mapa de cuerdas (donde cadena se utiliza como clave y el valor):

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

Esto funciona aunque realmente no entiendo por qué se necesita esto.

+1

'map.put (" k = 2 "," v = 2 "); System.out.println (map2.get ("k = 2")); 'salida es:' null' – seyed

2

¿Está limitado a usar solo HashMap ??

Por qué no puede ser tan flexible JSONObject puede hacer mucho con él.

Puede convertir String jsonString a 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

no se puede hacer esto directamente, pero lo hice de una manera loca como a continuación ...

La idea básica es que, primero es necesario convertir HashMap Cadena en Json luego puede deserializar Json utilizando Gson/Genson, etc. en HashMap de nuevo.

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

aplicación ...

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); 
0

espero que realmente se necesita para obtener el valor de la cuerda al pasar la llave HashMap. Si ese es el caso, entonces no tenemos que volver a convertirlo a Hashmap. Use el siguiente método y podrá obtener el valor como si hubiera sido recuperado de Hashmap.

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

Hace el trabajo para mí.

0

Esto puede ser ineficiente e indirecto. Pero

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

should work !!!