如何用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
相关产品推荐
相关产品推荐

