如何通过Volley解析嵌套JSON数组并提取X/Y轴数据绘制Android图表
嘿,我刚好折腾过类似的嵌套JSON数组解析+Volley+Android图表的需求,给你一步步理清楚怎么搞:
解决Volley解析嵌套JSON数组(market_cap)并提取X/Y轴数据的方案
第一步:用Volley发起JSON请求并获取响应
首先我们用Volley的JsonObjectRequest来请求数据,这样能直接拿到JSON对象,省去自己转字符串的步骤:
// 初始化Volley请求队列 RequestQueue queue = Volley.newRequestQueue(context); String url = "你的JSON数据接口地址"; JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { // 在这里处理JSON解析逻辑 parseMarketCapData(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 请求失败的处理,比如Toast提示 Toast.makeText(context, "请求数据失败", Toast.LENGTH_SHORT).show(); } }); // 将请求加入队列 queue.add(jsonObjectRequest);
第二步:解析嵌套的market_cap数组
接下来就是核心的解析部分了。你的market_cap是一个嵌套数组,每个子数组的第一个元素是X轴日期,第二个是Y轴价格。我们可以用两个ArrayList分别存储X轴和Y轴的数据:
private void parseMarketCapData(JSONObject response) { ArrayList<String> xAxisDates = new ArrayList<>(); ArrayList<Double> yAxisPrices = new ArrayList<>(); try { // 获取market_cap对应的JSON数组 JSONArray marketCapArray = response.getJSONArray("market_cap"); // 遍历每个子数组 for (int i = 0; i < marketCapArray.length(); i++) { JSONArray itemArray = marketCapArray.getJSONArray(i); // 提取日期(X轴):如果是时间戳,记得转成可读格式;如果已经是字符串直接用 long timestamp = itemArray.getLong(0); // 转成yyyy-MM-dd格式的日期字符串 String dateStr = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) .format(new Date(timestamp)); xAxisDates.add(dateStr); // 提取价格(Y轴) double price = itemArray.getDouble(1); yAxisPrices.add(price); } // 解析完成后,把数据传给图表绘制方法 setupChart(xAxisDates, yAxisPrices); } catch (JSONException e) { e.printStackTrace(); Toast.makeText(context, "解析数据失败", Toast.LENGTH_SHORT).show(); } }
这里要注意:如果你的日期不是时间戳,而是直接的字符串(比如"2024-05-01"),那直接用itemArray.getString(0)就行,不用转时间戳。
第三步:把解析后的数据传给图表库
假设你用的是常用的MPAndroidChart库,我们可以把上面的ArrayList转成图表需要的Entry列表,然后设置给LineChart:
private void setupChart(ArrayList<String> xDates, ArrayList<Double> yPrices) { LineChart lineChart = findViewById(R.id.line_chart); ArrayList<Entry> entries = new ArrayList<>(); for (int i = 0; i < yPrices.size(); i++) { // Entry的第一个参数是X轴的索引(或者你也可以用时间戳转成float),第二个是Y轴价格 entries.add(new Entry(i, yPrices.get(i).floatValue())); } LineDataSet dataSet = new LineDataSet(entries, "Market Cap"); dataSet.setColor(Color.BLUE); dataSet.setValueTextColor(Color.BLACK); LineData lineData = new LineData(dataSet); // 设置X轴的标签 lineChart.getXAxis().setValueFormatter(new ValueFormatter() { @Override public String getFormattedValue(float value) { return xDates.get((int) value); } }); lineChart.setData(lineData); lineChart.invalidate(); // 刷新图表 }
这样一套流程下来,就能把嵌套的market_cap数据提取出来,转成图表需要的X/Y轴数据啦。如果你的图表库不是MPAndroidChart,逻辑也是类似的——先把数据提取到集合里,再转成对应库要求的数据格式就行。
内容的提问来源于stack exchange,提问作者nyjxrb30
相关产品推荐
相关产品推荐

