今天被一个问题搞得头痛,解决了就决定记录下来。
问题描述:
页面text文本框直接传map格式的字符串到后台,如何还原成Map格式?
这里给出一个map格式的字符串:
{历史=100, 数学=88, 语文=64, 英语=50}
由于key和value之间是“=”,而不是“:”,所以无法通过fastJson包直接转换成JSONObject对象。
某度出来的结果都是下面这种方式:
Map<String, String> map1 = new HashMap<String, String>();
map1.put("语文", "64");
map1.put("数学", "88");
map1.put("英语", "50");
map1.put("历史", "100");
String strMap = map1.toString();
String[] strArray = strMap.split(",");
Map<String, String> changeMap = new HashMap<String, String>();
for (String str : strArray) {
changeMap.put(str.split("=")[0], str.split("=")[1]);
}
通过“,”分割各元素,再进一步组建,这确实可以解决类似于这种简单形式的map,但如果某个key放置的是另外一个map对象呢?类似于下面这种形式:
Map<String, String> map2 = new HashMap<String, String>();
map2.put("物理", "100");
map2.put("化学", "98");
map2.put("生物", "88");
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("语文", "64");
map1.put("数学", "88");
map1.put("英语", "50");
map1.put("历史", "100");
map1.put("理综", map2);
map1有个key为map2对象,这种形式下的字符串格式为:
{历史=100, 理综={物理=100, 生物=88, 化学=98}, 数学=88, 语文=64, 英语=50}
上面那种方法就无效了,或许你还会想到其他分解方式,但下面这种解决方式是最有效的。
使用net.sf.json包中的JSONObject对象
String strMap = map1.toString();
//JSONObject.parseObject(strMap);
net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(strMap);
@SuppressWarnings("unchecked")
Map<String, Object> changeMap = (Map<String, Object>)jsonObject;
@SuppressWarnings("unchecked")
Map<String, String> lizongMap = (Map<String, String>)changMap.get("理综");
上面这种方式可以弥补fastJson的不足。
注意,此时有一个奇怪的现象,jsonObject 的格式是:
{"历史":100,"理综":{"化学":"98","物理":"100","生物":"88"},"数学":88,"语文":64,"英语":50}
这个格式是符合我们预期的,正常的JSONObject类型的对象,经过强制转换后changeMap格式:
{历史=100, 理综={"化学":"98","物理":"100","生物":"88"}, 数学=88, 语文=64, 英语=50}
最外层的json转换成map,最里层保持JSONObject格式不变。
但是,把此changeMap对象作为参数传入某个方法去执行,获取“理综”的value却是:
{物理=100, 生物=88, 化学=98}
自动把JSONObject转成map格式的了。针对这种情况,如果要保持JSONObject格式不被转换成Map,可以在传参之前,用fastJson的JSONObject.parseObject(arg1,arg2)方法转换一下即可。
Map<String, Object> requestMap =JSONObject.parseObject(jsonObject.toString(), Map.class);
而不是强制转换。
版权声明:本文为nobody_1原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。