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 的主要内容,如果未能解决你的问题,请参考以下文章
更新 Firestore 中 Array 的 Map 数据 - Flutter