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

如何从带自动生成数字键的嵌套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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:03:23