Flutter中如何正确JSON编码List并通过HTTP POST传递至服务器
解决Flutter中通过HTTP POST传递OrderItem列表的问题
你遇到的核心问题是**List<OrderItem>并没有内置的toJson()方法**,直接调用orderItems.toJson()自然会报错。我们需要先把列表里的每个OrderItem对象转换成可序列化的Map,再把整个列表编码成JSON字符串,才能正确传递给服务器。
解决方案步骤:
逐个转换列表元素为Map
用List.map()遍历orderItems,对每个元素调用它自己的toJson()方法,最后把转换结果转成List:orderItems.map((item) => item.toJson()).toList()更新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中的嵌套类(FreshProducts、Order、ProductSize)也都正确使用了@JsonSerializable()注解,并且生成了对应的toJson()方法,不然JSON编码时会抛出异常。 - 调试技巧:如果还是报错,可以单独打印
orderItemMaps的内容,检查是否有无法序列化的字段。 - 服务器适配:要确认服务器端接口是接收JSON数组格式,而不是单个对象,否则会出现解析失败的情况。
内容的提问来源于stack exchange,提问作者PeakGen




