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

如何用Java Jackson解析以itemID为Key的大REST API JSON

解决方案

你需要调整两个核心部分:给Data类添加itemID字段,以及用Map<Integer, Data>替代List<Data>存储数据——这样既能保留每个条目对应的物品ID,又能实现O(1)时间复杂度的ID查询。

1. 更新Data类

先给Data类添加itemID属性,同时更新构造方法和toString方法(方便调试输出):

public class Data {
    private final int itemID;
    private final int high;
    private final int highTime;
    private final int low;
    private final int lowTime;

    // 新增itemID参数的构造器
    public Data(int itemID, int high, int highTime, int low, int lowTime) {
        this.itemID = itemID;
        this.high = high;
        this.highTime = highTime;
        this.low = low;
        this.lowTime = lowTime;
    }

    // Getter方法(按需添加,比如获取itemID)
    public int getItemID() {
        return itemID;
    }

    // 重写toString,包含itemID
    @Override
    public String toString() {
        return "Data{itemID=" + itemID + ", high=" + high + ", highTime=" + highTime + ", low=" + low + ", lowTime=" + lowTime + "}";
    }
}

2. 修改JSON解析逻辑

原来的forEach只会遍历data节点的value,无法拿到作为itemID的key。我们需要遍历JsonNode的键值对集合,同时提取key和value:

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
        .GET()
        .uri(URI.create("https://prices.runescape.wiki/api/v1/osrs/latest"))
        .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
ObjectMapper mapper = new ObjectMapper();
JsonNode json = mapper.readTree(response.body());
JsonNode data = json.get("data");

// 用HashMap存储,键是itemID(Integer类型),值是对应的Data对象
Map<Integer, Data> itemMap = new HashMap<>();

// 遍历data节点的所有键值对
Iterator<Map.Entry<String, JsonNode>> iterator = data.fields();
while (iterator.hasNext()) {
    Map.Entry<String, JsonNode> entry = iterator.next();
    // 把字符串类型的itemID转成Integer
    int itemID = Integer.parseInt(entry.getKey());
    JsonNode itemData = entry.getValue();
    
    Data d = new Data(
            itemID,
            itemData.get("high").asInt(),
            itemData.get("highTime").asInt(),
            itemData.get("low").asInt(),
            itemData.get("lowTime").asInt()
    );
    itemMap.put(itemID, d);
}

3. 根据itemID查询数据

现在可以直接通过itemMap.get(itemID)快速获取指定物品的数据,比如查询ID为6的物品:

// 查询itemID=6的数据
Data targetItem = itemMap.get(6);
if (targetItem != null) {
    System.out.println(targetItem);
} else {
    System.out.println("未找到itemID为6的物品数据");
}

输出示例

现在遍历itemMap的话,输出会包含itemID:

Data{itemID=2, high=157, highTime=1672071161, low=150, lowTime=1672071151}
Data{itemID=6, high=xxx, highTime=xxx, low=xxx, lowTime=xxx}
...

内容的提问来源于stack exchange,提问作者rairai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:10:35