无法解析 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 中的 JSON 数据解析

在flutter中解析嵌套的JSON列表时出错

Flutter 中的 JSON 解析和 Map

Flutter DistanceMatrix JSON 无法正确解析

如何使用从 Flutter 中的 json 解析的嵌套映射列表中的函数创建对象

在 Flutter 中提取 JSON 数据时遇到问题