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

如何在Dart/Flutter中实现toJson编码以支持HTTP POST请求?

解决Dart中包含List的类转JSON的问题

你的核心问题是Coletas类的toJson方法没有正确处理内部的List,且键名没有和后端/fromJson的格式对应,以下是具体修正方案:

问题分析

  1. 你尝试的toJSon方法拼写错误(应为toJson),且没有正确引用对象属性(直接写dataIni而不是value.dataIni)
  2. Coletas原有的toMap方法既没包含itemList,键名也和fromJson里的后端字段不匹配(比如fromJson用dtData,你却用dataIni)
  3. 没有把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:20:25