Flutter JSON数组解析出错:异常:类型'dynamic=> xxx不是'f'类型'Map <String,dynamic>=> List <xxx>'的子类型

问题描述

很抱歉,如果重复了这个问题,但是我没有找到解决方法

错误

异常:类型'(dynamic)=> PostalModel'不是类型的子类型 '(f )=>列表'

我所做的事情:

  1. 调用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);
    }
    
  2. 解析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;
     }
    
  3. 将数据绑定到正文中

    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链接检查JSON,并且我已经从here创建了一个Model类。

解决方法

API返回JSON数组,而不是JSON对象,所以它是List,而不是Map。

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

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

return Users.fromJson(jsonresponse[0]);
,

最后,我成功实现了以下解决方案:

// 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