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
相关产品推荐
相关产品推荐

