Java中如何将对象封装为数组?支付网关item_details格式修正
解决Java中支付网关item_details对象数组的构造问题
你的核心问题是把商品详情组织成了单个带序号键的Map,但支付网关需要的是对象数组(JSON Array),对应Java里的List<Map<String, Object>>结构。以下是修改后的代码:
public KeyValuePair<String, String> requestSnapToken(String orderNo, BigDecimal grossAmount, int paymentMethodId, String firstName, String email, List<FormCartLine> itemDetails ) { return FAILSAFE_EXECUTOR.get(() -> { String midtransOrderId = orderNo; Builder<String, Object> custDetailBuilder = new ImmutableMap.Builder<String, Object>() .put("first_name", firstName) .put("last_name", ""); // 替换成List存储每个商品的独立Map,对应JSON数组 List<Map<String, Object>> itemDetailsList = new ArrayList<>(); for (FormCartLine line : itemDetails) { // 改用增强for循环更简洁 // 每个商品创建一个独立的Map,键不带序号 Map<String, Object> itemMap = new ImmutableMap.Builder<String, Object>() .put("id", line.getProductId()) .put("price", line.getUnitPricePreTax()) .put("quantity", line.getQty()) .put("name", line.getName()) .put("brand", line.getBrandName()) .put("category", line.getCategoryName()) .build(); itemDetailsList.add(itemMap); } Builder<String, Object> payloadBuilder = new ImmutableMap.Builder<String, Object>() .put("transaction_details", new ImmutableMap.Builder<String, Object>() .put("order_id", midtransOrderId) .put("gross_amount", String.valueOf(grossAmount.longValue())) .build()) .put("item_details", itemDetailsList) // 这里传入List而非单个Map .build(); // 补充原代码遗漏的build() // 此处需补充发送请求、处理响应并返回KeyValuePair的逻辑 }); }
关键修改点:
- 将原来的
ImmutableMap.Builder<String, Object> itemDetailsBuilder替换为List<Map<String, Object>>,用来存储每个商品的独立对象,对应JSON数组结构。 - 循环中为每个
FormCartLine创建不带序号后缀键的Map,添加到List中,确保每个商品是独立的对象。 - payload中
item_details对应的值改为这个List,序列化后会生成符合要求的JSON数组。 - 补上原代码遗漏的
payloadBuilder.build(),确保能生成完整的payload对象。
内容的提问来源于stack exchange,提问作者frankfurt
相关产品推荐
相关产品推荐

