zoukankan      html  css  js  c++  java
  • Redis读取出错,JSON序列化的问题

    报错

      org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.alibaba.fastjson.JSONException: syntax error, expect {, actual string, pos 1, fastjson-version 1.2.44

    问题分析

      在写入缓存的时候,hash结构,它的value值,在写入前使用JSON 序列化了,JSON.toJSONString(value)
      在取缓存的时候把一个Collection 作为对象序列化了,并不是把List 序列化,所以在反序列化的时候不能用List 来解析

    // 读取缓存返回String
    BoundHashOperations<String, String, String> hash = this.template.boundHashOps(key);
    Collection list = hash.entries().values();
    return JSON.toJSONString(list);

    // 将String 解析成 List
    String tmp = redisService.listHashObject(BOOK_CATALOG);
    return JSON.parseArray(tmp, BookCatalog.class);

       问题出在这里了,把Collection 转成List 出错 ,首先强转是不行的

    解决

    // 读取缓存直接返回 Collection
    BoundHashOperations<String, String, String> hash = this.template.boundHashOps(key);
    return hash.entries().values();

    // 将Collection 转成List,不能直接转成对象,需要先转换成String ,再将单个String 反序列化成对象
    java.util.Collection tmp = redisService.listHashObject(BOOK_CATALOG);
    List<String> list = new ArrayList<>(tmp);
    List<BookCatalog> ans = new ArrayList<>(list.size());
    for (String item : list) {
        BookCatalog book = JSON.parseObject(item, BookCatalog.class);
        ans.add(book);
    }

    //可以再排个序,本身的hash 结构是无序的  ans.sort(Comparator.comparing(BookCatalog::getCode));

    return ans;

    原创文章,欢迎转载,转载请注明出处!

  • 相关阅读:
    Mysql配置文件解析
    Mysql的视图
    Setup和 Hold
    洛谷 P2257
    洛谷 P3455
    洛谷 P1447
    洛谷 P1155
    洛谷 P1262
    洛谷 P4180
    洛谷 P5540
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/redis_fastjson.html
Copyright © 2011-2022 走看看