You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter中如何正确JSON编码List并通过HTTP POST传递至服务器

解决Flutter中通过HTTP POST传递OrderItem列表的问题

你遇到的核心问题是**List<OrderItem>并没有内置的toJson()方法**,直接调用orderItems.toJson()自然会报错。我们需要先把列表里的每个OrderItem对象转换成可序列化的Map,再把整个列表编码成JSON字符串,才能正确传递给服务器。

解决方案步骤:

  1. 逐个转换列表元素为Map
    List.map()遍历orderItems,对每个元素调用它自己的toJson()方法,最后把转换结果转成List:

    orderItems.map((item) => item.toJson()).toList()
    
  2. 更新HTTP请求的body参数
    把原来的convert.json.encode(orderItems.toJson())替换成上面的转换结果,再进行JSON编码。

修改后的完整代码:

import 'dart:convert' as convert;
import 'package:http/http.dart' as http;

Future<int> saveOrderItemList(List<OrderItem> orderItems) async {
  int responsetag = 0;
  try {
    // 先将每个OrderItem转为Map,再组成List,最后编码为JSON
    final List<Map<String, dynamic>> orderItemMaps = 
        orderItems.map((item) => item.toJson()).toList();
    
    final http.Response response = await http.post(
      Uri.parse("http://你的接口地址"), // 用Uri.parse替代字符串,更符合规范
      body: convert.json.encode(orderItemMaps),
      headers: {
        "Accept": "application/json",
        "Content-Type": "application/json" // 首字母大写,避免部分服务器解析异常
      },
    );

    final int statusCode = response.statusCode;
    print("RESPONSE: " + response.body);
    print("STATUS CODE: " + statusCode.toString());

    if (statusCode < 200 || statusCode >= 400 || response.body.isEmpty) {
      throw Exception("Error while fetching data: Status code $statusCode");
    } else {
      responsetag = int.parse(response.body);
    }
    return responsetag;
  } catch (error) {
    rethrow; // 直接抛出错误,方便上层统一处理
  }
}

额外注意事项:

  • 嵌套对象的序列化:要确保OrderItem中的嵌套类(FreshProductsOrderProductSize)也都正确使用了@JsonSerializable()注解,并且生成了对应的toJson()方法,不然JSON编码时会抛出异常。
  • 调试技巧:如果还是报错,可以单独打印orderItemMaps的内容,检查是否有无法序列化的字段。
  • 服务器适配:要确认服务器端接口是接收JSON数组格式,而不是单个对象,否则会出现解析失败的情况。

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

火山引擎 最新活动