如何从带自动生成数字键的嵌套JSON取数?解决Dart类过长问题
解决带有自动生成数字键的JSON数据获取与Dart类优化问题
一、从数字键嵌套JSON中获取数据
核心思路是不把动态生成的数字键当作固定属性,而是通过遍历或转换为集合统一处理:
1. JavaScript/TypeScript环境
const jsonData = { "0": { "Id": "1", "name": "rob" }, "1": { "Id": "2", "name": "kevin" }, "3": { "Id": "3", "name": "Joe" } }; // 方式1:遍历所有键值对 Object.entries(jsonData).forEach(([key, item]) => { console.log(`索引${key}: Id=${item.Id}, 姓名=${item.name}`); }); // 方式2:转为数组统一处理(更推荐,方便使用数组方法) const userArray = Object.values(jsonData); // 例如查找Id为"2"的用户 const targetUser = userArray.find(user => user.Id === "2"); console.log(targetUser);
2. Dart环境
直接用Map解析后,通过遍历或转换为列表操作:
import 'dart:convert'; void main() { final jsonStr = ''' { "0": {"Id": "1", "name": "rob"}, "1": {"Id": "2", "name": "kevin"}, "3": {"Id": "3", "name": "Joe"} } '''; final Map<String, dynamic> jsonMap = jsonDecode(jsonStr); // 遍历所有用户 jsonMap.forEach((index, userJson) { print('索引$index: Id=${userJson['Id']}, 姓名=${userJson['name']}'); }); // 转为列表统一处理 final List<dynamic> userList = jsonMap.values.toList(); // 筛选特定用户 final targetUser = userList.firstWhere((user) => user['Id'] == '3'); print(targetUser); }
二、优化JSON转Dart类的问题
在线工具生成的数字属性类完全不合理,因为数字键是动态索引,正确做法是定义子对象类,用集合(Map或List)包裹这些子对象:
1. 定义子对象类(User)
先为每个数字键对应的用户对象创建单独的类:
class User { final String id; final String name; User({required this.id, required this.name}); // 从JSON解析User对象 factory User.fromJson(Map<String, dynamic> json) { return User( id: json['Id'] as String, name: json['name'] as String, ); } // 转为JSON Map<String, dynamic> toJson() { return { 'Id': id, 'name': name, }; } }
2. 用集合包裹所有User对象
不需要生成带数字属性的类,直接用Map<String, User>或List<User>存储:
// 解析为Map<String, User>(保留原始索引键) final Map<String, User> usersMap = jsonMap.map( (key, value) => MapEntry(key, User.fromJson(value)), ); // 或者转为List<User>(更适合顺序操作) final List<User> usersList = usersMap.values.toList();
3. 可选:自定义包裹类(如果需要统一结构)
如果一定要用一个类整体包裹,可以这样定义:
class UserCollection { final List<User> users; UserCollection({required this.users}); factory UserCollection.fromJson(Map<String, dynamic> json) { final userList = json.values.map((userJson) => User.fromJson(userJson)).toList(); return UserCollection(users: userList); } Map<String, dynamic> toJson() { return { for (int i = 0; i < users.length; i++) i.toString(): users[i].toJson(), }; } }
这样处理后,代码简洁易维护,完全避免了生成大量无意义的数字属性。
内容的提问来源于stack exchange,提问作者Lamawut
相关产品推荐
相关产品推荐

