自己以前编写整理的工具类,不需要导包,主要部分仅使用JAVA系统自带类库即可完成。
为了使用方便,直接处理 HttpServletRequest 对象,支持解析前端传回JSON中带的Map对象、List<Map>对象及键值对。
(测试时勿用String转JSON的JSON,表达的Map及List<Map>会被解析成String)
具体代码如下:
import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.Map.Entry;
/**
* @author bluecoolcool
* @date 2018/06/28 16:12
*/
public class RequestUtils {
/**
* 返回map
* @param request
* @return
*/
public static Map<String,Object> getMap(HttpServletRequest request){
Map<String,Object> mapPrarm = new HashMap<String, Object>();
Map map = request.getParameterMap();
Set ketSet = map.entrySet();
String listName = "";
boolean isList = false;
List paramList = new ArrayList();
Map paramMap = new HashMap();
for (Iterator it = ketSet.iterator();it.hasNext();) {
Entry me = (Entry) it.next();
Object key = me.getKey();
Object value = me.getValue();
String[] valueArr = new String[1];
if(value instanceof String[]){
valueArr = (String[]) value;
}else{
valueArr[0] = value.toString();
}
if(key.toString().contains("[") && key.toString().contains("]")){
String newName = key.toString().substring(0,key.toString().indexOf("]")+1);
String[] finalValueArr = valueArr;
String newValue = Arrays.toString(finalValueArr).substring(1, Arrays.toString(finalValueArr).length()-1);
String keyName = key.toString().substring(key.toString().lastIndexOf("[")+1,key.toString().lastIndexOf("]"));
isList = letterOrNum(key.toString().substring(key.toString().indexOf("[")+1,key.toString().indexOf("]")));
if(listName.equals("")){
listName = newName;
paramMap.put( keyName , newValue);
}else if(listName.equals(newName)){
paramMap.put( keyName , newValue);
}else if(listName.substring(0,listName.indexOf("[")).equals(newName.substring(0,newName.indexOf("[")))){
if(isList){
paramList.add(paramMap);
listName = newName;
paramMap = new HashMap();
paramMap.put( keyName , newValue);
}else{
paramMap.put( keyName , newValue);
}
}else{
if(letterOrNum(listName.substring(listName.indexOf("[")+1,listName.indexOf("]")))){
paramList.add(paramMap);
mapPrarm.put(listName.substring(0,listName.indexOf("[")), paramList);
}else{
mapPrarm.put(listName.substring(0,listName.indexOf("[")), paramMap);
}
listName = newName;
paramList = new ArrayList<>();
paramMap = new HashMap();
paramMap.put( keyName , newValue);
}
}else{
if(listName.equals("")){
for(int k = 0;k<valueArr.length;k++){
mapPrarm.put(key.toString(), valueArr[k]);
}
}else{
if(letterOrNum(listName.substring(listName.indexOf("[")+1,listName.indexOf("]")))) {
paramList.add(paramMap);
mapPrarm.put(listName.substring(0, listName.indexOf("[")), paramList);
}else{
mapPrarm.put(listName.substring(0, listName.indexOf("[")), paramMap);
}
for (int k = 0; k < valueArr.length; k++) {
mapPrarm.put(key.toString(), valueArr[k]);
}
listName = "";
paramList = new ArrayList<>();
paramMap = new HashMap();
}
}
}
if(!(listName.equals(""))){
if(letterOrNum(listName.substring(listName.indexOf("[")+1,listName.indexOf("]")))) {
paramList.add(paramMap);
mapPrarm.put(listName.substring(0,listName.indexOf("[")), paramList);
}else{
mapPrarm.put(listName.substring(0, listName.indexOf("[")), paramMap);
}
}else if(!(paramMap.size()==0)){
mapPrarm.put(listName.substring(0,listName.indexOf("[")), paramMap);
}
return mapPrarm;
}
/**
* 判断字符串中是否包含字符串和字母的情况
* 都为数字返回true
* 包含数字和字符或都是字符返回false
* 来自网络
* @param str
* @return
*/
public static boolean letterOrNum(String str){
boolean isDigit = false;//定义一个boolean值,用来表示是否包含数字
boolean isLetter = false;//定义一个boolean值,用来表示是否包含字母
for(int i=0 ; i<str.length() ; i++){ //循环遍历字符串
if(Character.isDigit(str.charAt(i))){ //用char包装类中的判断数字的方法判断每一个字符
isDigit = true;
}
if(Character.isLetter(str.charAt(i))){ //用char包装类中的判断字母的方法判断每一个字符
isLetter = true;
}
}
if(isDigit && (!isLetter)){
return true;
}else{
return false;
}
}
}
测试下,前端页面写个简单的请求,对象中包含三种结构的数据,如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<button onclick="test()" >测试</button>
</body>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script>
let data = {
"name": "张某某",
"age": "15",
"address": {
"city": "黑龙江",
"country": "中国"
},
"another": [
{
"name": "操作手册",
"property": "中文"
},
{
"name": "简介文档",
"property": "概括"
}
]
}
function test(){
$.post("http://localhost:8088/test/jsm",data,function(result){
alert("success")
});
}
</script>
</html>
后台测试打印:
@Override
public Object jsm(HttpServletRequest request) {
//获得的Map
Map<String, Object> map = RequestUtils.getMap(request);
System.out.println("Map: "+ map);
//获得Map中的成员Map
Map address = (Map) map.get("address");
System.out.println("成员Map: "+ address);
//获得Map中的成员List<Map>
List another = (List) map.get("another");
System.out.println("成员List<Map>: "+ another);
return "";
}
控制台输出结果:
Map: {address={country=中国, city=黑龙江}, another=[{name=操作手册, property=中文}, {name=简介文档, property=概括}], name=张某某, age=15}
成员Map: {country=中国, city=黑龙江}
成员List<Map>: [{name=操作手册, property=中文}, {name=简介文档, property=概括}]
综上所叙,拿来即用。
但功能还未完善,如不支持纯数组形式的数据,以后有需求在修改。