Json与JavaBean之间的转换

文章讲述了在电商项目中,如何利用JSON与javaBean之间的转换来存储和获取数据,特别是在用户登录信息处理上。通过调用远程服务获取登录信息,然后转换成json字符串存入Redis,用户访问时再从Redis中获取并转换回原数据。文章提到了使用阿里的FastJson和谷歌的Gson进行转换,并展示了自定义工具类的代码示例。
摘要由CSDN通过智能技术生成

说到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();
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值