Flutter中如何避免硬编码索引访问JSON的features数组,转而使用列表实现?
重构JSON解析代码,摆脱硬编码索引
没问题!硬编码[0]、[1]这种索引确实很不灵活——要是数据源里的features数量变化(比如某天地震多了或少了),你的代码很容易出问题。咱们来重构一下,用列表结构来处理,既灵活又易维护。
第一步:封装单个地震特征的类
先定义一个小类,专门存单条地震数据的place和mag,让每条数据的结构更清晰:
class EarthquakeFeature { final String place; final double mag; EarthquakeFeature({required this.place, required this.mag}); factory EarthquakeFeature.fromJson(Map<String, dynamic> json) { return EarthquakeFeature( place: json["properties"]["place"], mag: json["properties"]["mag"].toDouble(), ); } }
第二步:修改主类为列表结构
把原来的Other类里的多个title、mag字段换成一个List<EarthquakeFeature>,这样就能容纳任意数量的地震数据:
class Other { final List<EarthquakeFeature> features; Other({required this.features}); factory Other.fromJson(Map<String, dynamic> json) { // 把JSON里的features数组转换成我们定义的EarthquakeFeature列表 final featuresList = json["features"] as List; final earthquakeFeatures = featuresList .map((featureJson) => EarthquakeFeature.fromJson(featureJson)) .toList(); return Other(features: earthquakeFeatures); } }
第三步:使用重构后的代码
现在你可以灵活地访问所有地震数据,不用再依赖硬编码索引:
// 假设你已经获取并解析了JSON数据 final earthquakeData = Other.fromJson(jsonResponse); // 遍历所有地震信息 for (final feature in earthquakeData.features) { print("地点: ${feature.place}, 震级: ${feature.mag}"); } // 如果需要取前3条(和你原来的需求一致) if (earthquakeData.features.length >= 3) { final firstQuake = earthquakeData.features[0]; final secondQuake = earthquakeData.features[1]; final thirdQuake = earthquakeData.features[2]; // 在这里使用这三条数据即可 }
为什么这样更好?
- 灵活性更高:不管数据源返回1条还是100条地震数据,代码都能正常处理
- 可维护性强:以后要加新的字段(比如时间、深度),只需要在
EarthquakeFeature里添加,不用修改Other类的核心逻辑 - 代码更简洁:避免了重复的
json["features"][n]["properties"]这种冗余代码
内容的提问来源于stack exchange,提问作者afugur
相关产品推荐
相关产品推荐

