如何使用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
相关产品推荐
相关产品推荐

