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

Flutter加载本地JSON文件时遭遇FormatException: Unexpected end of input错误的解决求助

解决Flutter加载JSON时的FormatException及图片加载问题

看起来你遇到的FormatException: Unexpected end of input是两个常见问题叠加导致的,我帮你一步步排查解决:

一、先搞定JSON解析失败的核心问题

这个错误提示说明程序尝试解析的是空字符串,或者JSON本身语法无效,我们从这两点入手:

1. 修正Asset资源的配置与路径

Flutter不会自动识别lib/目录下的资源,你必须先在pubspec.yaml里声明这些文件:

flutter:
  assets:
    # 声明JSON文件所在目录
    - lib/utils/json/
    # 声明图片资源所在目录
    - lib/utils/assets/

如果没做这个配置,Flutter根本找不到你的JSON文件,返回的就是空字符串,自然解析失败。

2. 修复JSON文件的语法错误

你提供的JSON示例里有个明显的语法问题:最后一个键值对后面多了个逗号:

{
    "rating":"4.5",
    "title":"sometitle",
    "text":"sometext",
    "img":"lib/utils/assets/image_1", // 这里的逗号必须删掉!
}

JSON不允许对象最后一个属性后面加逗号,删掉这个逗号就能避免解析报错。

二、优化你的加载代码

你现在的代码混用了await和then,不仅可读性差,还没做错误捕获,建议改成更清晰的async/await写法:

List? popularBooks;

// 给方法加上返回类型,添加try-catch捕获错误
Future<void> loadJsonData() async {
  try {
    String loadedJson = await DefaultAssetBundle.of(context).loadString("lib/utils/json/popular_books.json");
    setState(() {
      popularBooks = json.decode(loadedJson);
    });
  } catch (e) {
    print("加载JSON出错: $e");
    // 这里可以给用户显示错误提示,比如SnackBar
  }
}

@override
void initState() {
  super.initState(); // 最佳实践:先调用super.initState再执行自己的逻辑
  loadJsonData();
}

三、优化PageView的图片加载逻辑

为了避免空指针和图片加载失败的问题,给PageView加上更稳妥的处理:

PageView.builder(
  itemCount: popularBooks?.length ?? 0,
  controller: _controller,
  itemBuilder: (context, index) {
    // 空安全检查,避免popularBooks为空时崩溃
    if (popularBooks == null) return const SizedBox.shrink();
    
    final book = popularBooks![index];
    return Container(
      margin: const EdgeInsets.only(right: 10),
      height: 150,
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(10),
      ),
      child: Image.asset(
        book["img"] as String,
        fit: BoxFit.cover, // 让图片适配容器,避免拉伸变形
        // 图片加载失败时显示占位内容
        errorBuilder: (context, error, stackTrace) {
          return const Center(child: Text("图片加载失败"));
        },
      ),
    );
  },
),

按上面的步骤做完,应该就能解决你的问题了。

内容的提问来源于stack exchange,提问作者Muhammad Adnan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 02:52:40