如何在Dart/Flutter中实现toJson编码以支持HTTP POST请求?
解决Dart中包含List的类转JSON的问题
你的核心问题是Coletas类的toJson方法没有正确处理内部的List
问题分析
- 你尝试的
toJSon方法拼写错误(应为toJson),且没有正确引用对象属性(直接写dataIni而不是value.dataIni) - Coletas原有的
toMap方法既没包含itemList,键名也和fromJson里的后端字段不匹配(比如fromJson用dtData,你却用dataIni) - 没有把
itemList里的每个Itens对象转换成对应的JSON结构
正确实现步骤
1. 给Coletas类添加标准的toJson方法
要和fromJson的字段一一对应,同时处理itemList的转换:
- 字段名要和后端一致(比如
dtData对应dataIni、iCodigo对应codigo、stItens对应itemList) - 对
itemList使用map遍历每个Itens对象,调用其已实现的toJson方法,再转成List
2. 处理可选参数(dataFin、status)
如果后端允许接收null值,可以直接加入;如果要求null时不包含该字段,可使用条件判断过滤
修改后的完整代码
import 'dart:convert'; // 命名优化:改为itensFromJson更贴合功能 List<Itens> itensFromJson(String str) => List<Itens>.from(jsonDecode(str).map((x) => Itens.fromJson(x))); class Coletas { final int codigo; final String dataIni; String? dataFin; // 去掉不必要的late,构造函数已初始化可选参数 String? status; final List<Itens> itemList; Coletas({ required this.dataIni, this.dataFin, this.status, required this.codigo, required this.itemList, }); factory Coletas.fromJson(Map<String, dynamic> json) { return Coletas( dataIni: json['dtData'], codigo: json['iCodigo'], dataFin: json['dataFin'], // 补充可选参数的解析逻辑 status: json['status'], itemList: List<Itens>.from(json['stItens'].map((x) => Itens.fromJson(x))), ); } // 符合规范的toJson方法,完全匹配后端字段格式 Map<String, dynamic> toJson() { final Map<String, dynamic> data = { 'dtData': dataIni, 'iCodigo': codigo, 'stItens': itemList.map((item) => item.toJson()).toList(), }; // 可选参数不为null时才加入,避免传递无效null值给后端 if (dataFin != null) data['dataFin'] = dataFin; if (status != null) data['status'] = status; return data; } } class Itens { final int? id; final int codigo; int quantidade; // 去掉不必要的late,构造函数已初始化 String? status; final String codigoEAN; Itens({ this.id, this.status, required this.codigo, required this.codigoEAN, required this.quantidade, }); Map<String, dynamic> toJson() { final Map<String, dynamic> data = { 'iCodigo': codigo, // 修正大小写,和fromJson的字段保持一致 'sCodigoBarras': codigoEAN, 'iQtd': quantidade, }; // 可选参数的处理逻辑 if (id != null) data['id'] = id; if (status != null) data['status'] = status; return data; } factory Itens.fromJson(Map<String, dynamic> json) { return Itens( id: json['id'], // 补充id字段的解析 status: json['status'], codigo: json['iCodigo'], codigoEAN: json['sCodigoBarras'], quantidade: json['iQtd'], ); } }
用法示例
当你需要把Coletas对象转成JSON字符串用于POST请求时:
// 创建示例对象 final coleta = Coletas( codigo: 1, dataIni: '2024-05-20', itemList: [ Itens(codigo: 100, codigoEAN: '123456789', quantidade: 5), ], ); // 转成符合要求的JSON字符串 final jsonStr = jsonEncode(coleta); // 此时jsonStr可直接用于HTTP POST请求的请求体
额外注意点
- 字段大小写要和后端严格一致(比如你之前Itens的toJson里写的
icodigo应该改成iCodigo,和fromJson对应) - 去掉不必要的
late修饰符:可选参数在构造函数里已经初始化,不需要用late - 如果后端要求null字段不出现,就用条件判断过滤;如果允许null,直接加入即可
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

