Flutter JSON Array Parsing getting error : Exception: type '(dynamic) => xxx is not a subtype of

Posted

技术标签:

【中文标题】Flutter JSON Array Parsing getting error : Exception: type \'(dynamic) => xxx is not a subtype of type \'(Map<String, dynamic>) => List<xxx>\' of \'f\'【英文标题】:Flutter JSON Array Parsing getting error : Exception: type '(dynamic) => xxx is not a subtype of type '(Map<String, dynamic>) => List<xxx>' of 'f'Flutter JSON Array Parsing getting error : Exception: type '(dynamic) => xxx is not a subtype of type '(Map<String, dynamic>) => List<xxx>' of 'f' 【发布时间】:2021-02-17 03:37:25 【问题描述】:

对不起,如果它重复了这个问题,但我没有找到解决方案。

错误:

例外:类型“(动态)=> PostalModel”不是类型的子类型 '(Map) => List' of 'f'

我做了什么:

    调用 API:

    Future<PostalModel> fetchPhotos(http.Client client) async 
       final response =
        await client.get('https://api.postalpincode.in/pincode/364710');
    
       // Use the compute function to run parsePhotos in a separate isolate.
       return compute(parsePostalPincode, response.body);
    
    

    解析 JSON:

     // A function that converts a response body into a List.
     PostalModel parsePostalPincode(String responseBody) 
       print(responseBody);
       final parsed = jsonDecode(responseBody).cast<Map<String, dynamic>>();
       print('Parsed : $parsed'); //Getting Log OUTPUT
       PostalModel postalModel = parsed.map<List<PostalModel>>((json) => PostalModel.fromJson(json));
       print('Postal Model : $postalModel'); //Getting Log OUTPUT
       return postalModel;
     
    

    在正文中绑定数据:

    body: FutureBuilder<PostalModel>(
      future: fetchPhotos(http.Client()),
      builder: (context, snapshot) 
        print('snapshot $snapshot'); // Getting Error Here
        // "AsyncSnapshot<PostalModel>(ConnectionState.done, null, Exception: type '(dynamic) => PostalModel' is not a subtype of type '(Map<String, dynamic>) => List<PostalModel>' of 'f')"
        if (snapshot.hasError) print(snapshot.error);
    
        return snapshot.hasData
           ? PostOfficeList(postOfficeList: snapshot.data.postOffice)
           : Center(child: CircularProgressIndicator());
      ,
    ),
    

您可以从 API Link 检查 JSON,我已经从 here 创建了一个模型类。

【问题讨论】:

【参考方案1】:

API 返回 JSON 数组,而不是 JSON 对象,因此是 List,而不是 Map。

即如果您的模型类名称是 User,则 User JSON 是 JSON Array 的第一个元素。

所以要获取第一个元素,请使用第一个索引。内部获取信息更新

return Users.fromJson(jsonresponse[0]);

【讨论】:

【参考方案2】:

最后,我通过以下解决方案获得了成功:

// A function that converts a response body into a List.
PostalModel parsePostalPincode(String responseBody) 
  final parsed = jsonDecode(responseBody).cast<Map<String, dynamic>>();
  print('Parsed : $parsed[0]'); 
  PostalModel postalModel = PostalModel.fromJson(parsed[0]);
  print('Postal Model : $postalModel');
  return postalModel;

Flutter 对于新手来说太疯狂了。 :P

【讨论】:

以上是关于Flutter JSON Array Parsing getting error : Exception: type '(dynamic) => xxx is not a subtype of 的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:JSON无键数组到列表

更新 Firestore 中 Array 的 Map 数据 - Flutter

flutter 解析本地json

[Flutter] 08-Flutter中的Json转Model

如何在flutter中读取本地json导入?

Flutter应用程序在使用flutter_driver运行时无法加载Json文件