Android开发:如何从JSON数组取JSONObject及获取promotion_price
嘿,我来帮你搞定这两个JSON解析的问题!
问题1:如何从JSON数组中获取JSONObject
这个操作其实很直观,核心就是先拿到JSONArray实例,再通过索引定位目标JSONObject,不过要记得处理异常避免崩溃。给你一步步拆解:
- 第一步:把JSON字符串(或者接口响应返回的JSON数据)转换成
JSONArray对象 - 第二步:调用
getJSONObject(int index)方法,传入目标对象的索引(从0开始计数),就能拿到对应的JSONObject - 第三步:一定要捕获
JSONException,比如索引越界、JSON结构不合法这类情况都可能触发异常
给你一个适配Android环境的Java示例:
try { // 示例JSON数组字符串 String jsonArrayStr = "[{\"product_name\": \"手机\", \"price\": 2999}, {\"product_name\": \"平板\", \"price\": 1999}]"; JSONArray jsonArray = new JSONArray(jsonArrayStr); // 获取数组中第一个JSONObject(索引为0) JSONObject firstProduct = jsonArray.getJSONObject(0); String productName = firstProduct.getString("product_name"); double price = firstProduct.getDouble("price"); Log.d("JSON解析", "第一个产品:" + productName + ",价格:" + price); } catch (JSONException e) { e.printStackTrace(); Log.e("JSON解析", "解析出错:" + e.getMessage()); }
问题2:Android Volley解析时promotion_price返回null的解决方案
首先得排查几个常见坑:字段名拼写是否和JSON里完全一致(大小写、下划线都不能错)、promotion_price是不是嵌套在子对象里、Volley的响应解析逻辑有没有遗漏层级。下面给你一套标准的正确实现,你可以对照自己的JSON结构调整:
假设你的JSON结构大概是这样(如果实际结构不同,对应调整层级即可):
{ "code": 200, "data": [ { "product_id": 1, "product_name": "无线耳机", "original_price": 399, "promotion_price": 299 } ] }
以下是Volley的正确解析代码:
// 初始化Volley请求队列 RequestQueue queue = Volley.newRequestQueue(context); String url = "你的接口请求URL"; JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try { // 先判断接口返回状态(可选,根据你的接口规范调整) int code = response.getInt("code"); if (code == 200) { // 获取产品数据数组 JSONArray productArray = response.getJSONArray("data"); // 遍历数组(如果只有单个元素,直接调用getJSONObject(0)也可以) for (int i = 0; i < productArray.length(); i++) { JSONObject productObj = productArray.getJSONObject(i); // 重点:获取promotion_price,字段名必须和JSON完全一致 // 如果字段可能为null,用optXXX方法更安全,避免抛出异常 double promotionPrice = productObj.optDouble("promotion_price", 0.0); // 如果是字符串类型的价格,改用optString // String promotionPriceStr = productObj.optString("promotion_price", "0"); Log.d("Volley解析", "促销价格:" + promotionPrice); } } } catch (JSONException e) { e.printStackTrace(); Log.e("Volley解析", "解析失败:" + e.getMessage()); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("Volley错误", "请求失败:" + error.getMessage()); } }); // 将请求加入队列执行 queue.add(jsonObjectRequest);
几个关键注意点:
- 必须保证
promotion_price的字段名和JSON中完全一致,比如不要写成promotionPrice或者Promotion_Price - 如果JSON里的
promotion_price可能不存在或者为null,优先用optXXX方法(比如optDouble、optString),而不是getXXX,这样不会因为字段缺失触发异常 - 如果
promotion_price嵌套在子JSONObject里(比如{"product_detail": {"promotion_price": 299}}),需要先获取product_detail这个子对象,再从中提取promotion_price
内容的提问来源于stack exchange,提问作者Haider Shah Hashmi
相关产品推荐
相关产品推荐

