无法解析 Flutter 中的 JSON 数据。颤振中的Json解析器错误
Posted
技术标签:
【中文标题】无法解析 Flutter 中的 JSON 数据。颤振中的Json解析器错误【英文标题】:Unable to parse the JSON data in flutter. Json Parser Error in flutter 【发布时间】:2020-07-13 09:01:45 【问题描述】:日志:
[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: FormatException: Unexpected character (at line 2, character 1)
E/flutter (13817): <!DOCTYPE html>
E/flutter (13817): ^
E/flutter (13817):
E/flutter (13817): #0 _ChunkedJsonParser.fail (dart:convert-patch/convert_patch.dart:1394:5)
E/flutter (13817): #1 _ChunkedJsonParser.parseNumber (dart:convert-patch/convert_patch.dart:1261:9)
E/flutter (13817): #2 _ChunkedJsonParser.parse (dart:convert-patch/convert_patch.dart:926:22)
E/flutter (13817): #3 _parseJson (dart:convert-patch/convert_patch.dart:31:10)
E/flutter (13817): #4 JsonDecoder.convert (dart:convert/json.dart:495:36)
E/flutter (13817): #5 JsonCodec.decode (dart:convert/json.dart:153:41)
E/flutter (13817): #6 _MainFetchDataState._fetchData (package:prepareyourselfforexams/QuizPage.dart:24:17)
E/flutter (13817): <asynchronous suspension>
E/flutter (13817): #7 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:706:14)
E/flutter (13817): #8 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:789:36)
E/flutter (13817): #9 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
E/flutter (13817): #10 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:486:11)
E/flutter (13817): #11 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:264:5)
E/flutter (13817): #12 BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:199:7)
E/flutter (13817): #13 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:467:9)
E/flutter (13817): #14 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:76:12)
E/flutter (13817): #15 PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:117:9)
E/flutter (13817): #16 _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:379:8)
E/flutter (13817): #17 PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:115:18)
E/flutter (13817): #18 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:7)
E/flutter (13817): #19 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:218:19)
E/flutter (13817): #20 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:198:22)
E/flutter (13817): #21 GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:156:7)
E/flutter (13817): #22 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)
E/flutter (13817): #23 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)
E/flutter (13817): #24 _rootRunUnary (dart:async/zone.dart:1138:13)
E/flutter (13817): #25 _CustomZone.runUnary (dart:async/zone.dart:1031:19)
E/flutter (13817): #26 _CustomZone.runUnaryGuarded (dart:async/zone.dart:933:7)
E/flutter (13817): #27 _invoke1 (dart:ui/hooks.dart:273:10)
E/flutter (13817): #28 _dispatchPointerDataPacket (dart:ui/hooks.dart:182:5)
E/flutter (13817):
这是我的文件代码:
class MainFetchData extends StatefulWidget
@override
_MainFetchDataState createState() => _MainFetchDataState();
class _MainFetchDataState extends State<MainFetchData>
List list = List();
var isLoading = false;
_fetchData() async
setState(()
isLoading = true;
);
final response =
await http.get("https://prepare-your-exams.firebaseio.com/");
if (response.statusCode == 200)
var data = response.body;
print(response.statusCode);
data = json.decode(data).toString();
list = data as List;
setState(()
isLoading = false;
);
else
print("Data is not loaded");
print(response.statusCode);
@override
Widget build(BuildContext context)
return Scaffold(
appBar: AppBar(
title: Text("Fetch Data JSON"),
),
bottomNavigationBar: Padding(
padding: const EdgeInsets.all(8.0),
child: RaisedButton(
child: new Text("Fetch Data"),
onPressed: _fetchData,
),
),
body: isLoading
? Center(
child: CircularProgressIndicator(),
)
: ListView.builder(
itemCount: list.length,
itemBuilder: (BuildContext context, int index)
return
//QuizPage( mydata: list,);
ListTile(
contentPadding: EdgeInsets.all(10.0),
title: Text(list[index][1]),
trailing: Text(list[index][2]),
);
));
来自 Firebase 的 Json 文件预览: enter image description here
【问题讨论】:
错误发生在哪里? 这看起来有问题:data = json.decode(data).toString(); list = data as List;
。您首先得到一个String
,然后尝试将其转换为List
。
你能分享你的回复正文吗?
我认为问题出在 data = json.decode(data).toString();列表 = 数据作为列表;。当你解析一个 json 文件时,你会得到一个 hashmap 看看这个链接flutter.dev/docs/cookbook/networking/background-parsing
【参考方案1】:
您正在从响应中获取字符串。然后,您将其转换为列表。
为什么您在该列表中再次使用.toString()
?不需要那个。只需删除它并运行。它会解决你的问题。
data = json.decode(data);
list = data as List;
【讨论】:
附上响应正文。 附在哪里? 不是我问的,是db的截图。我以文本格式询问来自 API 的响应以上是关于无法解析 Flutter 中的 JSON 数据。颤振中的Json解析器错误的主要内容,如果未能解决你的问题,请参考以下文章
Flutter DistanceMatrix JSON 无法正确解析