Android Java预订系统JSON生成仅保留最后值问题求助
解决JSON生成重复最后一次值的问题
看起来你遇到的核心问题是对象引用重复和结构不符合服务器预期这两个点,我来帮你一步步梳理并修正代码:
先明确问题根源
- 你定义的
detail对象在循环外,每次循环只是修改这个对象的属性值,而不是创建新对象。因为JSON对象是引用类型,所以buy数组里的所有元素其实都是指向同一个detail对象,最后自然只会保留循环最后一次的数值。 - 服务器预期的
buy是一个JSONObject(键是行程ID,值是乘客数组),但你把buy定义成了JSONArray,结构完全不对,这也是导致后续异常的原因之一。
修正后的代码示例
// 外层请求对象,对应服务器预期的整体结构 final JSONObject requestBody = new JSONObject(); // 服务器需要的buy对象,键是行程ID,值是该行程下的乘客数组 final JSONObject buyObject = new JSONObject(); for (int i = 0; i < list_id_content.size(); i++) { // 关键:每次循环都创建新的detail对象,避免引用重复 final JSONObject detail = new JSONObject(); // 获取当前循环对应的行程ID(假设list_id_content里存的是每个行程的ID,比如583、584) String currentTripId = list_id_content.get(i).toString(); // 根据你的实际类型调整 // 填充乘客信息 detail.put("title", gelar); detail.put("nama_depan", nama_depan); detail.put("nama_belakang", nama_belakang); detail.put("tanggal_lahir", tanggal_lahir); detail.put("nationality", nationality); detail.put("identitas", identitas); detail.put("kelas_id", id_event); detail.put("kelas", kelas); detail.put("harga", total_harga_pertiket); detail.put("seat", ""); // 你原来的代码这里少了个引号,记得补上 // 检查当前行程ID在buyObject里有没有对应的数组 JSONArray passengerArray = buyObject.optJSONArray(currentTripId); if (passengerArray == null) { // 如果没有,新建一个数组 passengerArray = new JSONArray(); buyObject.put(currentTripId, passengerArray); } // 把当前乘客对象添加到对应行程的数组里 passengerArray.put(detail); } // 把buyObject放到外层请求的buy键中 requestBody.put("buy", buyObject); // 最后requestBody就是符合服务器要求的JSON结构了
代码说明
- 每次循环都新建
detail对象,确保每个乘客信息都是独立的实例,不会被后续循环覆盖。 - 用
buyObject这个JSONObject来存储每个行程ID对应的乘客数组,完全匹配服务器预期的buy结构。 - 通过
optJSONArray检查是否已有对应行程的数组,避免重复创建,同时支持同一个行程下添加多个乘客。
这样生成的JSON就会和服务器预期的结构完全一致,并且能保留循环中所有的乘客信息啦。
内容的提问来源于stack exchange,提问作者themasmul
相关产品推荐
相关产品推荐

