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

Android使用Volley提交订单时orderedItems字段为空的问题解决

搞定Android提交JSON时orderedItems为null的问题

嘿,我看了你的代码和日志,这问题其实不难定位,主要是两个地方出了岔子,咱们一步步来修:

先说说为啥orderedItems变成[null,null]

你在getAllProducts()里犯了个小错误:HashMap.put()方法返回的是这个key之前的旧值,而你第一次往空HashMap里塞数据的时候,返回的全是null!你把这些null直接传给SaveOrderFormat的构造函数,结果每个商品对象的字段都没赋值,序列化的时候自然就变成null了。

另外,就算你把构造参数改对了,Volley默认也没法直接把自定义的SaveOrderFormat对象转成JSON对象——要么给这个类加对getter方法,要么干脆直接用Map来存商品信息,后者更简单。

修复步骤来了

1. 先把getAllProducts()改对

方案A:直接用Map存商品(最省心)

不需要自定义SaveOrderFormat,直接用HashMap包装每个商品的属性,这样Volley能直接把它转成JSON对象:

private List<Map<String, Object>> getAllProducts() {
    ArrayList<Map<String, Object>> formatProducts = new ArrayList<>();
    for (Item product : ShoppingCartController.getInstance().myProducts) {
        Map<String, Object> productMap = new HashMap<>();
        productMap.put("name", product.getName());
        productMap.put("manufacture", product.getManufacture());
        productMap.put("price", product.getPrice());
        productMap.put("image", product.getImage());
        productMap.put("count", product.getQuantity());
        formatProducts.add(productMap);
    }
    return formatProducts;
}

方案B:修复SaveOrderFormat类(如果坚持要用自定义类)

首先得把SaveOrderFormat的构造函数改对,直接传属性值,再加全字段的getter方法(JSON序列化必须要getter):

public class SaveOrderFormat {
    private String name;
    private String manufacture;
    private double price;
    private String image;
    private int count;

    // 正确的构造函数:直接接收属性值
    public SaveOrderFormat(String name, String manufacture, double price, String image, int count) {
        this.name = name;
        this.manufacture = manufacture;
        this.price = price;
        this.image = image;
        this.count = count;
    }

    // 必须添加所有字段的getter方法
    public String getName() { return name; }
    public String getManufacture() { return manufacture; }
    public double getPrice() { return price; }
    public String getImage() { return image; }
    public int getCount() { return count; }
}

然后修改getAllProducts(),直接传商品的属性值给构造函数:

private List<SaveOrderFormat> getAllProducts() {
    ArrayList<SaveOrderFormat> formatProducts = new ArrayList<>();
    for (Item product : ShoppingCartController.getInstance().myProducts) {
        formatProducts.add(new SaveOrderFormat(
                product.getName(),
                product.getManufacture(),
                product.getPrice(),
                product.getImage(),
                product.getQuantity()
        ));
    }
    return formatProducts;
}

2. 排查后端响应问题

日志里的End of input错误,大概率是后端收到无效JSON后,没返回任何响应(或者返回的不是JSON格式)。等你把前端数据修好之后,如果还报这个错,就得去查后端代码:是不是解析JSON时出错了?有没有返回有效的JSON响应(哪怕是错误提示)?

额外的小建议

  • 修复后可以在volleyCall里打印一下orderedItems的JSON格式,确认数据正确:
    Log.d(TAG, "Ordered Items JSON: " + new JSONArray(orderedItems).toString());
    
  • 日志里还有cusEmail:null这种空值,后端可能对必填字段有校验,最好也处理一下,避免因为字段为空导致保存失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:38:38