Redis读取出错,JSON序列化的问题

本文探讨了在使用FastJSON进行数据序列化与反序列化过程中遇到的问题,特别是在Redis缓存操作中出现的错误。当尝试将Collection类型的数据转换为List时遇到了语法错误,通过直接返回Collection并逐个元素转换的方式解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错

  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;

 

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

 

转载于:https://www.cnblogs.com/acm-bingzi/p/redis_fastjson.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值