Flutter应用json.decode()解码失败求助:原正常现报输入异常
解决Flutter中
json.decode()抛出FormatException的问题 从你给出的异常信息和代码来看,这个问题的核心是你传给json.decode()的是空字符串,所以解析时触发了Unexpected end of input错误。咱们一步步排查和修复:
先看代码里的几个关键问题
- 多余的
await:json.decode()是同步方法,不需要加await,这虽然不直接导致错误,但属于逻辑冗余。 - 不必要的SharedPreferences读写操作:你把
myStringList[i]存到'ss'键再读出来,完全是多此一举,直接使用myStringList[i]即可。 - 缺乏空值判断:如果
myStringList本身是null(比如SharedPreferences里没有'favorite'这个键),或者列表里存在空字符串元素,都会触发后续的解析错误。
修正后的代码
load() async { final prefs = await SharedPreferences.getInstance(); // 先清空数据 my_fav.clear(); Id.clear(); // 从SharedPreferences获取列表,先判空,避免null调用length final myStringList = prefs.getStringList('favorite'); if (myStringList == null || myStringList.isEmpty) { print("没有收藏数据"); return; } print("收藏列表长度: ${myStringList.length}"); for (int i = 0; i < myStringList.length; i++) { final jsonString = myStringList[i]; // 跳过空字符串,避免解析错误 if (jsonString.isEmpty) { print("第${i+1}项是空字符串,跳过解析"); continue; } try { // 直接解析字符串,去掉多余的await final k = items.fromJson(json.decode(jsonString)); if (!Id.contains(k.title)) { my_fav.add(k); Id.add(k.title); } } catch (e) { // 捕获单个项的解析错误,避免整个循环崩溃 print("解析第${i+1}项失败: $e"); } } }
额外建议
- 错误处理:加上
try-catch包裹解析逻辑,这样即使某一项JSON格式错误,也不会导致整个load()方法崩溃,还能定位到具体出错的项。 - 数据校验:在存入
favorite列表时,确保每个元素都是有效的JSON字符串,从源头避免空值或无效JSON的问题。 - 避免重复操作:像你之前把列表项存到
'ss'键再读取的操作完全没必要,直接使用列表元素即可,减少不必要的IO操作。
内容的提问来源于stack exchange,提问作者Muhamad J Jassim
相关产品推荐
相关产品推荐

