Преобразование HashMap.toString () обратно в HashMap в Java - PullRequest
27 голосов
/ 18 октября 2010

Я поместил пару ключ-значение в Java HashMap и преобразовал ее в String, используя метод toString().

Возможно ли преобразовать это представление String обратно вHashMap объект и получить значение с соответствующим ключом?

Спасибо

Ответы [ 10 ]

20 голосов
/ 18 октября 2010

Будет работать, если toString () содержит все данные, необходимые для восстановления объекта. Например, это будет работать для отображения строк (где строка используется в качестве ключа и значения):

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

Это работает, хотя я действительно не понимаю, зачем вам это нужно.

10 голосов
/ 18 октября 2010
Подход

toString() основан на реализации toString(), и в большинстве случаев он может привести к потерям.

Здесь не может быть без потерь решение. но лучше было бы использовать сериализацию объектов

сериализация объекта в строку

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

десериализация строки обратно в объект

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

Здесь, если пользовательский объект имеет переходные поля, они будут потеряны в процессе.


старый ответ


Как только вы конвертируете HashMap в String, используя toString (); Дело не в том, что вы можете преобразовать его обратно в Hashmap из этой строки, это просто его строковое представление.

Вы можете передать ссылку на HashMap методу или сериализовать ее

Вот описание для toString () toString ()
Здесь - пример кода с пояснениями для сериализации.

и передать hashMap методу как arg.

public void sayHello(Map m){

}
//calling block  
Map  hm = new HashMap();
sayHello(hm);
5 голосов
/ 18 октября 2010

я преобразовал HashMap в String с помощью метода toString () и передал другому методу, который берет String и преобразует эту String в объект HashMap

Это очень* очень плохой способ обойти HashMap.

Теоретически это может сработать, но слишком много может пойти не так (и он будет работать очень плохо).Очевидно, в вашем случае что-то идет не так.Мы не можем сказать, что, не увидев ваш код.

Но гораздо лучшим решением было бы изменить этот «другой метод» так, чтобы он просто принимал HashMap в качестве параметра, а не его строковое представление.

4 голосов
/ 02 июня 2014

вы не можете сделать это напрямую, но я сделал это сумасшедшим способом, как показано ниже ...

Основная идея состоит в том, что, сначала вам нужно конвертировать строку HashMap в Json, затем вы можете десериализовать Json с помощью Gson /Дженсон и т. Д. Снова в 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;
}

реализация ...

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 голосов
/ 14 июля 2012

Вы ограничены в использовании только HashMap ??

Почему он не может быть настолько гибким JSONObject Вы можете много с ним сделать.

Вы можете конвертировать *От 1007 * до 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();
}
3 голосов
/ 18 октября 2010

Вы не можете вернуться от строки к объекту.Так что вам нужно будет сделать это:

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 голосов
/ 18 октября 2010

Что вы пробовали?

objectOutputStream.writeObject(hashMap);

должно работать нормально, при условии, что все объекты в hashMap реализуют Serializable.

0 голосов
/ 30 декабря 2015

Это может быть неэффективно и косвенно. Но

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

должно работать !!!

0 голосов
/ 09 июля 2015

Надеюсь, вам действительно нужно получить значение из строки, передав ключ hashmap. Если это так, то нам не нужно преобразовывать его обратно в Hashmap. Используйте следующий метод, и вы сможете получить значение, как если бы оно было получено из самого 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;
}

Делает работу за меня.

0 голосов
/ 18 октября 2010

Можно перестроить коллекцию из представления строки, но она не будет работать, если элементы коллекции не переопределяют свой собственный метод toString.

Поэтому гораздо безопаснее и проще использовать стороннюю библиотеку, такую ​​как XStream , которая передает объекты в удобочитаемый XML-код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...