我在Java的HashMap
中放置了一个键值对,并使用toString()
方法将其转换为String
。
那么,是否可以将这个String
表示形式转换回HashMap
对象,并使用其相应的键检索值?
谢谢
如果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());
}
这个有效,尽管我真的不理解为什么需要这样做。
null
- seyedtoString()
方法依赖于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;
}
如果用户对象具有瞬态字段,那么在过程中它们将会丢失。
旧答案
一旦使用toString()方法将HashMap转换为字符串,就不能通过该字符串将其转换回HashMap,它只是其字符串表示形式。
您可以将HashMap的引用传递给方法,或者对其进行序列化处理。
这里是toString()方法的描述(链接)。这里提供了带有解释的序列化示例代码。
要将HashMap作为参数传递给方法,请参考下面的代码:
public void sayHello(Map m){
}
//calling block
Map hm = new HashMap();
sayHello(hm);
你不能直接这样做,但我用以下疯狂的方式实现了...
基本思路是,首先需要将HashMap String转换为Json,然后可以使用Gson/Genson等工具将Json反序列化为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;
}
implementation...
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);
yourMap = new Gson().fromJson(yourString, HashMap.class);
你尝试了什么?
objectOutputStream.writeObject(hashMap);
如果hashMap中的所有对象都实现了Serializable接口,那么应该可以正常工作。
您无法从字符串恢复为对象。因此,您需要执行以下操作:
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();
你是否被限制只能使用 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();
}
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(); }
public String convertWithStream(Map<Integer, ?> map) {
String mapAsString = map.keySet().stream()
.map(key -> key + "=" + map.get(key))
.collect(Collectors.joining(", ", "{", "}"));
return mapAsString; }
使用Stream将字符串转换回Map:
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; }
我希望您实际上需要通过传递哈希映射键从字符串中获取值。如果是这种情况,那么我们就不必将其转换回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;
}