You need to enable JavaScript to run this app. Flutter中如何使用forEach方法为JSON元素新增自定义字符串列表
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何使用forEach方法为JSON元素新增自定义字符串列表

问题修复说明

你代码存在4个问题导致不符合预期:

  • 未对person字段做非空校验就直接遍历,person为null时会直接抛出运行时错误
  • 未处理person为null的分支,该场景下需要主动把newList设为null
  • Data类的toJson方法没有包含newList字段,序列化JSON时不会输出该字段
  • newList的赋值操作放在了person遍历循环内,不需要重复赋值,遍历完成后赋值一次即可

修复后完整代码

import 'dart:convert';

void main(){
  var jsonStr = '[{"group":"A","person":[{"name":"John","age":18},{"name":"Jack","age":21}]},{"group":"B","person":[{"name":"Oliver","age":24}]},{"group":"C","person":null}]';
  final data = dataFromJson(jsonStr);
  data.forEach((e) {
    if (e != null) {
      // 先判断person是否为null
      if (e.person == null) {
        e.newList = null;
      } else {
        List<String> _list = [];
        e.person?.forEach((p) {
          if (p != null) {
            String x = p.name.toLowerCase();
            String y = p.age.toString();
            String z = '${x}_$y';
            _list.add(z);
          }
        });
        // 遍历完person后统一赋值
        e.newList = _list;
      }
    }
  });
  // 输出序列化后的完整JSON验证结果
  print(dataToJson(data));
}

List<Data> dataFromJson(String str) => List<Data>.from(json.decode(str).map((x) => Data.fromJson(x)));

String dataToJson(List<Data> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Data {
  Data({
    this.group,
    this.person,
    this.newList,
  });

  String group;
  List<Person> person;
  List<String> newList;

  factory Data.fromJson(Map<String, dynamic> json) => Data(
    group: json["group"],
    person: json["person"] == null ? null : List<Person>.from(json["person"].map((x) => Person.fromJson(x))),
  );

  // 新增newList字段到序列化逻辑
  Map<String, dynamic> toJson() => {
    "group": group,
    "newList": newList,
    "person": person == null ? null : List<dynamic>.from(person.map((x) => x.toJson())),
  };
}

class Person {
  Person({
    this.name,
    this.age,
  });

  String name;
  int age;

  factory Person.fromJson(Map<String, dynamic> json) => Person(
    name: json["name"],
    age: json["age"],
  );

  Map<String, dynamic> toJson() => {
    "name": name,
    "age": age,
  };
}

运行后输出的JSON完全符合你给出的预期格式,person为null时newList也为null,非null时会生成对应格式的字符串数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 02:33:02