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

如何使用json_serializable解析带键的JSON Map为User类?

用json_serializable实现带键参数的JSON解析

可以实现这个需求,json_serializable主要负责单个User对象的字段映射,外层Map的遍历和键的传递需要手动处理,具体方案如下:

1. 配置依赖

确保pubspec.yaml中添加了json_serializable相关依赖:

dependencies:
  json_annotation: ^4.8.1

dev_dependencies:
  build_runner: ^2.4.4
  json_serializable: ^6.7.1

执行flutter pub get(纯Dart项目用dart pub get)完成依赖安装。

2. 定义User类并自定义解析方法

保留json_serializable的自动生成能力(比如序列化方法),同时自定义带key参数的解析方法处理id赋值:

import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';

@JsonSerializable()
class User {
  final String id;
  final String name;

  User({required this.id, required this.name});

  // 自定义解析方法,将外层JSON的键作为User的id
  factory User.fromJsonWithKey(Map<String, dynamic> json, String key) {
    return User(
      id: key,
      name: json['name'] as String,
    );
  }

  // 可选:生成默认单参数fromJson(如需单独解析User对象)
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);

  // 让json_serializable自动生成序列化方法
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

3. 生成代码文件

在终端执行命令生成user.g.dart:

flutter pub run build_runner build

纯Dart项目替换为dart pub run build_runner build

4. 解析外层JSON结构

遍历外层Map的键值对,调用自定义方法生成User实例:

import 'dart:convert';

void main() {
  final jsonString = '''
  {
    "A1": {"name": "a"},
    "B2": {"name": "b"}
  }
  ''';

  final Map<String, dynamic> outerMap = jsonDecode(jsonString);
  final List<User> userList = outerMap.entries
      .map((entry) => User.fromJsonWithKey(entry.value, entry.key))
      .toList();

  // 验证结果
  for (var user in userList) {
    print('用户ID: ${user.id}, 用户名: ${user.name}');
  }
}

核心说明

json_serializable的核心作用是简化单个对象的字段序列化/反序列化逻辑,外层<String, Map>结构的遍历和键的传递属于业务逻辑层,需要手动处理。这种方案既利用了json_serializable的便捷性,又满足了将外层键作为User.id的需求。

内容的提问来源于stack exchange,提问作者user6097845

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:27:36