在开发过程中有时会遇到前台请求参数需要直接转换成对应的实体类,避免数据类型的转换,而请求数据类型多为json数据块。如何实现数据的直接转换呢?
开发场景:
前端请求json如下:
{
"id":"3",
"jobName":"test",
"jobGroup":"test",
"cronExpression":"0 0/1 * * * ? ",
"implUrl":"test"
}
转换成目标实体如下:
public class ScheduleJob {
private Long id;
private String jobName;
private int status;
private String jobGroup;
private String cronExpression;
private String implUrl;
private String remark;
}
实现方法:
public R save(HttpServletRequest request){
String requestJson = HttpAnalysisUtils.resolveRequestToBody(request);
ScheduleJob scheduleJob= (ScheduleJob) FastJsonConvertUtils.jsonToJavaObject(requestJson, ScheduleJob.class);
//TODO 业务实现
return R.ok();
}
HttpAnalysisUtils
package com.starehealth.overseer.utils;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.Set;
/**
* Created by b
*/
public class HttpAnalysisUtils {
/**
* analysis request json from url
* @param request method get
* @return
*/
public static String resolveRequestToUrl(HttpServletRequest request){
Map requestMap = request.getParameterMap();// resqustMap type is <Object,String[]>
/*把单个参数解析为字符 而不是数组*/
Set<Map.Entry<String, Object>> requestEntries = requestMap.entrySet();
requestEntries.parallelStream().forEach(n->{
Object[] values = (Object[]) n.getValue();
if (values.length == 1) n.setValue(values[0]);
});
return JsonConvertUtils.toJson(requestMap);
}
/**
* analysis request json from body
* @param request method post
* @return
*/
public static String resolveRequestToBody(HttpServletRequest request){
try {
int length = request.getContentLength();
String requestStr = "";
StringBuilder sb = new StringBuilder();
if (length != 0) {
InputStream inputStream = request.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
while ((requestStr = br.readLine()) != null) {
sb.append(requestStr);
}
br.close();
}
return sb.toString();
}catch (IOException e){
throw new RuntimeException(e);
}
}
}
FastJsonConvertUtils
package com.starehealth.overseer.utils;
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.builder.ToStringBuilder;
import java.util.Map;
/**
* fastJson 操作类
*
* @author sl
*
*/
public class FastJsonConvertUtils {
/**
* hippo-server used 清洗对象格式
*
* @param obj origin obj
* @return obj
*/
public static Object cleanseToObject(Object obj) {
if (obj == null) {
return null;
}
try {
if (obj.getClass().isPrimitive()) {
return obj;
} else {
return JSON.toJSONString(obj);
}
} catch (Exception e) {
throw new ClassCastException("obj cleanse:" + ToStringBuilder.reflectionToString(obj));
}
}
@SuppressWarnings("unchecked")
public static Map<String, Object> jsonToMap(String data) {
return JSON.parseObject(data, Map.class);
}
public static Object jsonToJavaObject(String object, Class<?> parameterType) {
return JSON.parseObject(object, parameterType);
}
}
JsonConvertUtils
package com.starehealth.overseer.utils;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.Set;
/**
* Created by b
*/
public class HttpAnalysisUtils {
/**
* analysis request json from url
* @param request method get
* @return
*/
public static String resolveRequestToUrl(HttpServletRequest request){
Map requestMap = request.getParameterMap();// resqustMap type is <Object,String[]>
/*把单个参数解析为字符 而不是数组*/
Set<Map.Entry<String, Object>> requestEntries = requestMap.entrySet();
requestEntries.parallelStream().forEach(n->{
Object[] values = (Object[]) n.getValue();
if (values.length == 1) n.setValue(values[0]);
});
return JsonConvertUtils.toJson(requestMap);
}
/**
* analysis request json from body
* @param request method post
* @return
*/
public static String resolveRequestToBody(HttpServletRequest request){
try {
int length = request.getContentLength();
String requestStr = "";
StringBuilder sb = new StringBuilder();
if (length != 0) {
InputStream inputStream = request.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
while ((requestStr = br.readLine()) != null) {
sb.append(requestStr);
}
br.close();
}
return sb.toString();
}catch (IOException e){
throw new RuntimeException(e);
}
}
}