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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:27:35