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
相关产品推荐
相关产品推荐

