• JSONObject反序列化失败:com.alibaba.fastjson.JSONException: syntax error, expect...


    背景

    使用之前的项目中有一段代码拷贝到现有系统中,无法兼容,同样的代码解析出现问题,代码如下:

    public void cacheCybertronSupperAdmin(SysUser sysUser) {
            redisTemplate.opsForValue().set(Constants.ACCESS_TOKEN_CACHE_NAME + ":" + cybertronToken, JSONObject.toJSONString(sysUser));
        }
    
    public SysUser getSysUser(String token) {
        Object object = redisTemplate.opsForValue().get(Constants.ACCESS_TOKEN_CACHE_NAME + ":" + token);
        if (object == null) {
            return null;
        } else {
            return JSONObject.parseObject(object.toString(), SysUser.class);  // 反序列化失败
        }
    }
    

    出现异常:com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 0, fastjson-version 1.2.70

    解决办法

    将原来的代码改为:

    public void cacheCybertronSupperAdmin(SysUser sysUser) {
            redisTemplate.opsForValue().set(Constants.ACCESS_TOKEN_CACHE_NAME + ":" + cybertronToken, JSONObject.toJSONString(sysUser));
        }
    
    public SysUser getSysUser(String token) {
        Object object = redisTemplate.opsForValue().get(Constants.ACCESS_TOKEN_CACHE_NAME + ":" + token);
        Object parse = JSON.parse(object);    // add
        if (object == null) {
            return null;
        } else {
            return JSONObject.parseObject(parse.toString(), SysUser.class);  // 反序列化失败
        }
    }
    

    过程探究

    我们看看原来的 object 和 现在的 parse 对象有什么不同?

    object:

    object:"{"ctime":1625641906000,"domainName":""
    

    parse:

    parse:{"ctime":1625641906000,"domainName":""
    

    不同之处如下图:显而易见

    原来是多了转义字符!!!!!!

  • 相关阅读:
    Eclipse 读取config目录下文件
    cakephp 中Console / Shell 有什么优点?
    cakephp中使用 find('count')方法
    [转]using components in Cakephp 2+ Shell
    [转]Git for windows 下vim解决中文乱码的有关问题
    在Foxmail中添加阿里云企业邮箱账号
    Cakephp在Controller中显示sql语句
    java线程的基本概念
    mysql varchar到底能存多少字符。
    mysql 联合索引匹配原则
  • 原文地址:https://www.cnblogs.com/hnxbp/p/15036566.html
Copyright © 2020-2023  润新知