Dart解析嵌套JSON数组为Freezed数据类时出现类型错误
解决Freezed解析嵌套JSON数组的类型错误
错误根源
你遇到的类型错误,本质是解析嵌套的neighborhoods数组时,误将单个对象的解析函数(Neighborhood.fromJson)当作可迭代的JSON数组传入,导致类型不匹配。
正确的Freezed数据类定义
先定义Neighborhood类:
import 'package:freezed_annotation/freezed_annotation.dart'; part 'neighborhood.freezed.dart'; part 'neighborhood.g.dart'; @freezed class Neighborhood with _$Neighborhood { const factory Neighborhood({ required String id, required String name, }) = _Neighborhood; factory Neighborhood.fromJson(Map<String, dynamic> json) => _$NeighborhoodFromJson(json); }
再定义包含嵌套数组的City类:
import 'package:freezed_annotation/freezed_annotation.dart'; import 'neighborhood.dart'; part 'city.freezed.dart'; part 'city.g.dart'; @freezed class City with _$City { const factory City({ required String id, required String name, required List<Neighborhood> neighborhoods, }) = _City; factory City.fromJson(Map<String, dynamic> json) => _$CityFromJson(json); }
正确的JSON解析代码
假设服务器返回的JSON结构如下:
{ "cities": [ { "id": "1", "name": "北京", "neighborhoods": [ {"id": "1-1", "name": "朝阳区"}, {"id": "1-2", "name": "海淀区"} ] } ] }
解析整个城市数组的代码:
import 'dart:convert'; // 假设responseBody是服务器返回的JSON字符串 final jsonData = jsonDecode(responseBody) as Map<String, dynamic>; final List<City> cities = (jsonData['cities'] as List<dynamic>) .map((cityJson) => City.fromJson(cityJson as Map<String, dynamic>)) .toList();
避免常见错误
- 错误写法(会触发类型错误):直接用单个对象解析函数处理数组
// 错误示例:把数组当成单个Map传入 neighborhoods: Neighborhood.fromJson(json['neighborhoods']) - 正确写法:先将JSON转成List,再遍历解析每个元素
// 若需手动处理嵌套数组(Freezed自动生成的代码已包含此逻辑,无需手动写) neighborhoods: (json['neighborhoods'] as List<dynamic>) .map((n) => Neighborhood.fromJson(n as Map<String, dynamic>)) .toList()
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

