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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:20:29