我从一个toString()
对象调用List<Map<String, String>>
得到一个字符串。一些示例代码是:
List<Map<String,String>> list = new ArrayList<Map<String,String>>();
Map<String, String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");
list.add(map);
String myStr = list.toString();
System.out.println(myStr);
此代码输出:
[{key2=value2, key1=value1}]
我正在寻找一种简单的方法来解析此字符串并再次将其转换为List<Map<String, String>>
。我只是想知道是否有任何构造函数/实用程序类可以轻松地执行此操作。我已经看过谷歌的Java Collections库和Guava,但我还没有找到任何已经构建的功能来实现这一点。这是否存在?
如果不是,我将只创建自己的解析器,但如果它存在,我会重用一些代码。我喜欢DRY的概念。
答案 0 :(得分:3)
一般情况下,你不能使用内置的toString
方法执行此操作,因为它没有做任何事情来使值可解析,它只是试图给你一个有用的表示。作为一个特别反常的例子,请考虑以下代码,该代码演示了两个不同的映射可以具有相同的打印表示:
import java.util.Map;
import java.util.TreeMap;
public class MapToStringExample {
public static void main(String[] args) {
Map<String,String> map1 = new TreeMap<>();
map1.put( "key1", "value1, key2=value2" );
System.out.println( "Map1: "+map1 );
Map<String,String> map2 = new TreeMap<>();
map2.put( "key1", "value1" );
map2.put( "key2", "value2" );
System.out.println( "Map2: "+map2 );
}
}
Map1: {key1=value1, key2=value2}
Map2: {key1=value1, key2=value2}
如果您想要读取这样的地图的印刷表示,您需要对可以放入的值进行一些限制(例如,不包含=
或{{1或者你需要编写自己的输出例程。)
如果您希望避免重写代码,可以查看将为您处理序列化和反序列化值的序列化API。当然,在这种情况下,你只是将字符串映射到字符串,你只需要一种方法来编写由一些分隔符分隔的交替键和值,以及一种在字符串表示中转义分隔符的方法(如果允许的话)出现在字符串中;如果不是,那么你甚至不需要逃避它)。这对序列化和反序列化任务来说并不太难。
答案 1 :(得分:1)
这就是我在评论中的意思:
Gson gson = new Gson();
List<Map<String,String>> list = Lists.newArrayList();
Map<String, String> map = Maps.newHashMap();
map.put("key1", "value1");
map.put("key2", "value2");
list.add(map);
String myStr = gson.toJson(list);
System.out.println(myStr);
List<Map<String,String>> newList = gson.fromJson(myStr, new TypeToken<List<Map<String, String>>>(){}.getType());
System.out.println(newList);
输出:
[{"key2":"value2","key1":"value1"}]
[{key2=value2, key1=value1}]