如何解决从Redis读取并JSON序列化时出现的错误问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计721个文字,预计阅读时间需要3分钟。
错误提示:`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`
问题分析:该错误表明在请求处理过程中出现了异常,具体原因是JSON解析错误。错误信息指出期望的JSON格式是{...},但实际上接收到的字符串格式不正确。
解决方案:请检查传入的JSON字符串格式,确保其符合JSON标准。以下是可能的原因和解决步骤:
1. 检查JSON格式:确保JSON字符串以{...开始,以}结束,并且中间的键值对格式正确,例如`key: value`。
2. 示例错误:如果字符串开头是key: value,但没有大括号,则应该修改为`{key: value}`。
3. 示例正确格式:正确的JSON格式示例: json { key1: value1, key2: value2 }
4. 检查版本兼容性:确保使用的fastjson库版本与JSON字符串格式兼容。错误信息中提到的版本是1.2.44,请确认这是您的项目所使用的版本。
5. 代码审查:检查相关代码,特别是处理JSON解析的部分,确保没有错误。
通过以上步骤,您应该能够定位并修复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;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。
本文共计721个文字,预计阅读时间需要3分钟。
错误提示:`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`
问题分析:该错误表明在请求处理过程中出现了异常,具体原因是JSON解析错误。错误信息指出期望的JSON格式是{...},但实际上接收到的字符串格式不正确。
解决方案:请检查传入的JSON字符串格式,确保其符合JSON标准。以下是可能的原因和解决步骤:
1. 检查JSON格式:确保JSON字符串以{...开始,以}结束,并且中间的键值对格式正确,例如`key: value`。
2. 示例错误:如果字符串开头是key: value,但没有大括号,则应该修改为`{key: value}`。
3. 示例正确格式:正确的JSON格式示例: json { key1: value1, key2: value2 }
4. 检查版本兼容性:确保使用的fastjson库版本与JSON字符串格式兼容。错误信息中提到的版本是1.2.44,请确认这是您的项目所使用的版本。
5. 代码审查:检查相关代码,特别是处理JSON解析的部分,确保没有错误。
通过以上步骤,您应该能够定位并修复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;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

