[英]Java Jackson how to parse large REST API JSON?
Api 我正在嘗試從https://prices.runescape.wiki/api/v1/osrs/latest獲取信息
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");
List<Data> items = new ArrayList<>();
data.forEach(item -> {
Data d = new Data(
item.get("high").asInt(),
item.get("highTime").asInt(),
item.get("low").asInt(),
item.get("lowTime").asInt()
);
items.add(d);
});
問題是 object 是 itemID。 所以如果我想要項目 ID 6。我不能這樣做,因為它不是 object 的屬性。
"2":{"high":164,"highTime":1672078170,"low":160,"lowTime":1672078164} ``
2是itemID和object。
下面是當我循環遍歷 arraylist 並將其打印出來時
Data{high=157, highTime=1672071161, low=150, lowTime=1672071151}
Data{high=187987, highTime=1672071066, low=182005, lowTime=1672070881}
Data{high=189903, highTime=1672071052, low=186820, lowTime=1672070884}
Data{high=190000, highTime=1672070957, low=184882, lowTime=1672070984}
您的 JSON 具有以下結構:
{
"data":{
"2":{ ... },
"6":{ ... },
"8":{ ... },
"10":{ ... },
"12":{ ... }
...
}
}
屬性"data"
不與 object 或List<Data>
相關聯,而是與Map<Integer,Data>
(或Map<String,Data>
)相關聯。
有幾種方法可以解析:
Map<Integer,Data> data
定義 object 。public static class DataWrapper {
private Map<Integer, Data1> data;
// getters, setters
}
使用示例:
String json = """
{
"data":{ ... }
}
""";
ObjectMapper mapper12 = new ObjectMapper();
DataWrapper dataWrapper = mapper12.readValue(json12, DataWrapper.class);
Map<Integer, Data1> dataMap = dataWrapper.getData();
System.out.println("item 6: " + dataMap.get(6));
JsonNode
,訪問映射到屬性"data"
的節點,並使用ObjectReader
及其方法ObjectReader.readValue()
將其解析為Map
。 要生成ObjectReader
,我們可以使用需要TypeReference
的ObjectMapper.readerFor()
方法。這就是第二種方法的實現方式:
String json = """
{
"data":{ ... }
}
""";
ObjectMapper mapper = new ObjectMapper();
JsonNode tree = mapper.readTree(json);
ObjectReader reader = mapper.readerFor(new TypeReference<Map<Integer, Data>>() {});
Map<Integer, Data> itemsMap = reader.readValue(tree.get("data"));
System.out.println("item 6: " + itemsMap.get(6));
Output:
item 6: Data{high=195500, highTime=1672079035, low=182009, lowTime=1672078518}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.