代码之家  ›  专栏  ›  技术社区  ›  Pratik Butani Umesh N

颤振JSON数组解析获取错误:异常:type'(dynamic)=>xxx不是'f'的type'(Map<String,dynamic>)=>List<xxx>'的子类型

  •  0
  • Pratik Butani Umesh N  · 技术社区  · 4 年前

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

    错误:

    例外情况:类型“(动态)=>PostalModel“”不是类型的子类型

    我所做的:

    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

    0 回复  |  直到 4 年前
        1
  •  3
  •   Pratik Butani Umesh N    4 年前

    API返回JSON数组,而不是JSON对象,所以这是列表,而不是映射。

    i、 e.如果您的模型类名是User,那么User JSON是JSON数组的第一个元素。

    return Users.fromJson(jsonresponse[0]);
    
        2
  •  0
  •   Pratik Butani Umesh N    4 年前

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

    弗利特对一个新手来说太疯狂了P