【问题标题】:Unable to parse the JSON data in flutter. Json Parser Error in flutter无法解析 Flutter 中的 JSON 数据。颤振中的Json解析器错误
【发布时间】: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

标签: android json firebase flutter dart


【解决方案1】:

您正在从响应中获取字符串。然后,您将其转换为列表。 为什么您在该列表中再次使用.toString()?不需要那个。只需删除它并运行。它会解决你的问题。

data = json.decode(data);
list = data as List;

【讨论】:

  • 附上响应正文。
  • 附在哪里?
  • 不是我问的,是db的截图。我以文本格式询问来自 API 的响应
猜你喜欢
  • 2019-01-17
  • 2021-10-27
  • 2023-03-05
  • 2021-08-23
  • 2020-03-01
  • 2021-09-25
  • 2021-02-25
  • 2020-09-12
  • 2021-10-21
相关资源
最近更新 更多