解析列表<map <string,string>&gt;字符串形式再次到POJO </map <string,string>

时间:2014-02-11 18:17:24

标签: java list collections map

我从一个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的概念。

2 个答案:

答案 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}]