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

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依赖的场景)

  1. 先定义返回结果实体类:
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; }
}
  1. 解析逻辑:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:36:11