You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:07:46