繁体   English   中英

解析列表 <Map<String,String> &gt;再次将字符串形式转换为POJO

[英]Parsing List<Map<String,String>> String form to POJO again

我得到一个字符串,该字符串来自List<Map<String, String>>对象的toString() 一些示例代码是:

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>>的简单方法。 我只是想知道是否有任何构造函数/实用程序类可以轻松地做到这一点。 我已经看过Google的Java Collections库和Guava了,但是我还没有找到任何内置的函数可以做到这一点。 是否存在?

如果不是,我将创建自己的解析器,但是如果存在的话,我将重用一些代码。 我喜欢DRY的概念。

通常,您无法使用内置的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}

如果您想读取地图的打印表示形式,则需要对可以放入的值进行一些限制(例如,不包含=, ),或者您需要编写您自己的输出例程)。

如果您希望避免重写代码,则可以考虑使用序列化API来为您处理序列化和反序列化值。 当然,在这种情况下,您只需要将字符串映射到字符串,您所需要的就是编写由一些定界符分隔的交替键和值的方法,以及在字符串表示形式中转义该定界符的方法(如果允许的话)。出现在字符串中;如果不是,则甚至不需要转义)。 序列化和反序列化任务并不难。

这就是我在评论中的意思:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM