说到json与javaBean之间的转换,这两者更加频繁,json本身就是作为数据交换格式而存在的。在项目中用到的地方很多。这里我只说最常见的一处位置:那就是将数据转换成json再存储到redis中。
redis作为缓存数据库,在电商项目中是标配。项目中一些变化次数不大或者固定数据,为了提高用户访问速度,往往会转换成json字符串存入到redis中。当用户访问时,会从redis中获取,再转换成原数据传人到前端页面展示。例如用户登录信息,如图:
/**
* 用户登录
*
* @param userLoginVo
* @return
*/
@Override
public String login(UserLoginVo userLoginVo, String redirectUrl, RedirectAttributes redirectAttributes,
HttpServletResponse response) {
//远程调用获取登录信息。
MemberLoginVo memberLoginVo = new MemberLoginVo();
BeanUtils.copyProperties(userLoginVo, memberLoginVo);
R r = this.userFeignService.memberLogin(memberLoginVo);
Map<String, String> errors;
if ("5".equalsIgnoreCase(r.get("code").toString())) {
errors = new HashMap<>();
errors.put("loginAcct", r.get("msg").toString());
redirectAttributes.addFlashAttribute("errors", errors);
return "redirect:" + WebConst.LOGIN_URL + "?redirectUrl=" + redirectUrl;
}
if ("6".equalsIgnoreCase(r.get("code").toString())) {
errors = new HashMap<>();
errors.put("passWord", r.get("msg").toString());
redirectAttributes.addFlashAttribute("errors", errors);
return "redirect:" + WebConst.LOGIN_URL + "?redirectUrl=" + redirectUrl;
}
if (r.getCode() != 0) {
return "redirect:" + WebConst.LOGIN_URL + "?redirectUrl=" + redirectUrl;
}
MemberEntity memberEntity = r.typeConversion("member", MemberEntity.class);
MemberLoginRespVo respVo = new MemberLoginRespVo();
respVo.setGender(String.valueOf(memberEntity.getGender()));
respVo.setMemberId(String.valueOf(memberEntity.getId()));
respVo.setMemberName(memberEntity.getUsername());
respVo.setNickName(memberEntity.getNickname());
respVo.setGrowth(memberEntity.getGrowth());
respVo.setIntegration(memberEntity.getIntegration());
String code = UUID.randomUUID().toString().replace("-", "");
Cookie cookie = new Cookie("loginToken", code);
cookie.setDomain("lihuking.com");
cookie.setMaxAge(WebConst.COOKIE_MAXAGE);
response.addCookie(cookie);
redisUtils.setDataToRedis(code,respVo );
if (redirectUrl.indexOf("?") != -1) {
return "redirect:" + redirectUrl + "&code=" + code;
}
return "redirect:" + redirectUrl + "?code=" + code;
}
/**
* 保存数据到redis中。
* @param key
* @param value
*/
public void setDataToRedis(String key, Object value) {
StringRedisTemplate template = new StringRedisTemplate(factory);
String jsonStr = JSON.toJSONString(value);
template.opsForValue().set(key, jsonStr,30, TimeUnit.MINUTES);
}
用户登录后会将用户信息转换成json缓存到redis中。
在这次项目中我使用的是阿里的fastJson,除此还有一个是谷歌的Gosn,这两个相对来说比较简单,
上手快,另外,我还自己封装了一个工具类,也一起发表出来。
implementation group: 'com.google.code.gson', name: 'gson', version: '2.10.1'
implementation group: 'com.alibaba', name: 'fastjson', version: '2.0.26'
import com.alibaba.fastjson2.JSON;
import com.google.gson.Gson;
import java.io.*;
import java.nio.charset.StandardCharsets;
public class JSONUtil {
/**
* 将javaBean转换成json字符串
* @param obj 需要转换的java对象
* @return json格式的字符串 json
* @param <T> 泛型参数,这里指javaBean的类型
*/
public static <T> String javaBeanToJsonStr(T obj){
Gson gson=new Gson();
String json = gson.toJson(obj);
return json;
}
/**
* 将json字符串转换成javaBean对象
* @param jsonStr json格式的字符串
* @param type 需要获得的javaBean的类型
* @return 返回一个javaBean对象
* @param <T> 泛型参数,这里指javaBean的类型
*/
public static <T> T jsonToJavaBean(String jsonStr,Class<T> type){
Gson gson=new Gson();
T t = gson.fromJson(jsonStr, type);
return t;
}
/**
* 将java对象转换为json对象
* @param obj 需要转换的java对象
* @return json对象
* @param <T> 泛型参数,这里指javaBean的类型
*/
public static <T> Object javaBeanToFastJson(T obj){
Object o = JSON.toJSON(obj);
return o;
}
/**
* json对象转换成java对象。
* @param type 需要获得的javaBean的类型
* @param obj json对象:
* @return javaBean
* @param <T> 泛型参数,这里指javaBean的类型
*/
public static <T> T fastJsonToJavaBean(Class<T> type,Object obj){
T t = JSON.to(type, obj);
return t;
}
/**
* 将指定文件中的json对象或者字符串转换成javaBean
* @param fileName 指定文件的文件名
* @param type 需要转换的javaBean的类型
* @return 返回转换的javaBean对象
* @param <T> 泛型参数,这里指javaBean的类型
* @throws IOException io异常
*/
public static <T> T jsonToJavaBeanByFileName(String fileName,Class<T> type)throws IOException{
//读取Resource目录下的json文件
InputStream in = JSONUtil.class.getResourceAsStream("/" + fileName);
//利用输入流获取json文件内容
BufferedReader br = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
StringBuilder buffer = new StringBuilder();
String line = "";
while ((line = br.readLine()) != null) {
buffer.append(line);
}
br.close();
T t = JSON.parseObject(buffer.toString(),type);
return t;
}
/**
* 将json对象序列化到resource目录下的文件中
* @param json 需要序列化的json字符串
* @param fileName 需要创建的文件名称
* @throws IOException io异常
*/
public static void writeJsonToText(String json,String fileName) throws IOException {
String filePath="src\\main\\resources\\"+fileName;
File file=new File(filePath);
if (!file.exists()){
file.createNewFile();
}
OutputStream out=new FileOutputStream(file);
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(out,StandardCharsets.UTF_8));
bw.write(json);
bw.close();
}
}