You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 02:01:16