Flutter JSON SyntaxError 仅在生产模式下出现,在调试模式下不出现
Flutter JSON SyntaxError only on Production, not in Debug mode
在我的 flutter 应用程序中,我想解析保存在资产目录中的 JSON 文件。当我在调试模式下在本地 运行 时,我可以毫无问题地解析文件,但是当它在生产环境中(由 Firebase 托管)运行 时,我得到这个 SyntaxError:
Uncaught FormatException: SyntaxError: Unexpected token < in JSON at position 0
下面是我在代码中读取文件的方式:
Future<String> _getEmoji() async {
String emoji;
if (_emojiList.isEmpty) {
final String response = await rootBundle.loadString('data-ordered-emoji.json');
final data = json.decode(response);
emoji = data[Random().nextInt(data.length)];
_emojiList = data;
} else {
emoji = _emojiList[Random().nextInt(_emojiList.length)];
}
return emoji;
}
我用的JSON就是这个文件:https://unpkg.com/unicode-emoji-json@0.3.1/data-ordered-emoji.json
根据 IntelliJ,它以 UTF-8 编码。
我在这里错过了什么?
编辑:在上面的方法中添加打印命令以弄清楚 JSON 的样子后,我发现它不是我保存在资产目录中的 JSON 文件。这是构建的 index.html 文件。这怎么可能?
抱歉我不能评论,所以我post这个答案。
可能 json 被打包在 '<' 和 '>' 中,所以 json 解码器无法解码它。
我建议您先打印响应并检查这个意外字符。如果有这个奇怪的字符,只需删除第一个和最后一个字符。
String loginToken="<Hello>";
System.out.println(loginToken.substring(1, loginToken.length()-1))
输出:你好
解决了。问题是 assets 目录没有包含在构建中。因此,我必须将其添加到 pubspec.yaml 文件中:
flutter:
assets:
- assets/
资产目录包含在 build/web/assets 中,并且 JSON 可用于生产。奇怪的是 index.html 被取而代之。
在我的 flutter 应用程序中,我想解析保存在资产目录中的 JSON 文件。当我在调试模式下在本地 运行 时,我可以毫无问题地解析文件,但是当它在生产环境中(由 Firebase 托管)运行 时,我得到这个 SyntaxError:
Uncaught FormatException: SyntaxError: Unexpected token < in JSON at position 0
下面是我在代码中读取文件的方式:
Future<String> _getEmoji() async {
String emoji;
if (_emojiList.isEmpty) {
final String response = await rootBundle.loadString('data-ordered-emoji.json');
final data = json.decode(response);
emoji = data[Random().nextInt(data.length)];
_emojiList = data;
} else {
emoji = _emojiList[Random().nextInt(_emojiList.length)];
}
return emoji;
}
我用的JSON就是这个文件:https://unpkg.com/unicode-emoji-json@0.3.1/data-ordered-emoji.json
根据 IntelliJ,它以 UTF-8 编码。
我在这里错过了什么?
编辑:在上面的方法中添加打印命令以弄清楚 JSON 的样子后,我发现它不是我保存在资产目录中的 JSON 文件。这是构建的 index.html 文件。这怎么可能?
抱歉我不能评论,所以我post这个答案。
可能 json 被打包在 '<' 和 '>' 中,所以 json 解码器无法解码它。
我建议您先打印响应并检查这个意外字符。如果有这个奇怪的字符,只需删除第一个和最后一个字符。
String loginToken="<Hello>";
System.out.println(loginToken.substring(1, loginToken.length()-1))
输出:你好
解决了。问题是 assets 目录没有包含在构建中。因此,我必须将其添加到 pubspec.yaml 文件中:
flutter:
assets:
- assets/
资产目录包含在 build/web/assets 中,并且 JSON 可用于生产。奇怪的是 index.html 被取而代之。