Android开发中如何拆分嵌套JSON并提取Records字段内的数组数据
解决方案
1 先修复现有代码的隐性bug
你当前代码存在致命问题:OkHttp的response.body().string()只能调用1次,调用后响应流会直接关闭,你代码里先打日志调用了一次,后续赋值给s的时候拿到的只会是空值,首先要修改这部分逻辑。
2 嵌套JSON解析实现
这里提供两种常用实现方案,你可以根据项目依赖选择:
方案1:使用Android自带org.json(无需额外引入依赖)
// 首先导入需要的类 import org.json.JSONArray; import org.json.JSONObject; private String TickData(String token) { OkHttpClient client = new OkHttpClient().newBuilder().build(); Request request = new Request.Builder() .url("https://history.truedata.in/getticks?symbol=NIFTY 50&from=211201T09:15:00&to=211201T15:30:00&response=json&bidask=1") .method("GET", null) .addHeader("Authorization", "Bearer " + token) .build(); String tickdata = ""; // 用来存储所有Records里的tick数据 List<List<Object>> tickList = new ArrayList<>(); try { Response response = client.newCall(request).execute(); // 只调用一次string(),先存到变量里再用 String responseStr = response.body().string(); Log.d(TAG, "TickData: tick data response: " + responseStr); // 开始解析JSON JSONObject jsonObject = new JSONObject(responseStr); // 先取status判断请求是否成功,success值可替换为接口实际返回的成功标识 String status = jsonObject.optString("status"); if ("success".equals(status)) { JSONArray recordsArr = jsonObject.optJSONArray("Records"); if (recordsArr != null) { for (int i = 0; i < recordsArr.length(); i++) { JSONArray tickItem = recordsArr.optJSONArray(i); if (tickItem != null) { List<Object> item = new ArrayList<>(); for (int j = 0; j < tickItem.length(); j++) { item.add(tickItem.get(j)); } // 单条tick数据格式:item.get(0)是时间戳,item.get(1)是价格,后续是其余字段 tickList.add(item); } } } // 这里可以根据需要把tickList转成你需要的格式赋值给tickdata返回 } } catch (Exception e) { e.printStackTrace(); } return tickdata; }
方案2:使用Gson解析(适合项目已引入Gson依赖的场景)
- 先定义返回结果实体类:
import com.google.gson.annotations.SerializedName; import java.util.List; public class TickResponse { @SerializedName("status") private String status; @SerializedName("Records") private List<List<Object>> records; // 自动生成getter、setter方法 public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public List<List<Object>> getRecords() { return records; } public void setRecords(List<List<Object>> records) { this.records = records; } }
- 解析逻辑:
private String TickData(String token) { OkHttpClient client = new OkHttpClient().newBuilder().build(); Request request = new Request.Builder() .url("https://history.truedata.in/getticks?symbol=NIFTY 50&from=211201T09:15:00&to=211201T15:30:00&response=json&bidask=1") .method("GET", null) .addHeader("Authorization", "Bearer " + token) .build(); String tickdata = ""; List<List<Object>> tickList = new ArrayList<>(); try { Response response = client.newCall(request).execute(); String responseStr = response.body().string(); Log.d(TAG, "TickData: tick data response: " + responseStr); Gson gson = new Gson(); TickResponse tickResponse = gson.fromJson(responseStr, TickResponse.class); if ("success".equals(tickResponse.getStatus())) { tickList = tickResponse.getRecords(); // 直接拿到所有tick数据,遍历即可使用 for (List<Object> item : tickList) { long timestamp = ((Number)item.get(0)).longValue(); double price = ((Number)item.get(1)).doubleValue(); // 按需取后续字段即可 } } } catch (Exception e) { e.printStackTrace(); } return tickdata; }
内容的提问来源于stack exchange,提问作者Techno World
相关产品推荐
相关产品推荐

