Подтвердить что ты не робот

Преобразование HashMap.toString() обратно в HashMap в Java

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

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

Спасибо

4b9b3361

Ответ 1

Подход 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);

Ответ 2

Он будет работать, если 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());
}

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

Ответ 3

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

Основная идея состоит в том, что, 1-го, вам нужно преобразовать HashMap String в Json, тогда вы снова можете десериализовать Json, используя Gson/Genson и т.д. в 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);

Ответ 4

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

Это очень хороший очень плохой способ передать HashMap.

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

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

Ответ 5

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

objectOutputStream.writeObject(hashMap);

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

Ответ 6

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

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

Ответ 7

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

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

Вы можете преобразовать String jsonString в 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();
}

Ответ 8

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

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

Ответ 9

Надеюсь, вам действительно нужно получить значение из строки, передав ключ 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;
}

Работает ли для меня работа.

Ответ 10

Использование ByteStream может преобразовать строку, но может возникнуть исключение OutOfMemory в случае больших строк. Baeldung предлагает несколько хороших решений в своем банке здесь: https://www.baeldung.com/java-map-to-string-conversion

Использование 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(); }

Обратите внимание, что лямбды доступны только на уровне языка 8 и выше Использование Stream:

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

Преобразование строки обратно в карту с помощью 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; }

Ответ 11

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

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

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