簡體   English   中英

Java Jackson如何解析大的REST API JSON?

[英]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));
  • 另一種方法是通過解析給定的 JSON 創建JsonNode ,訪問映射到屬性"data"的節點,並使用ObjectReader及其方法ObjectReader.readValue()將其解析為Map 要生成ObjectReader ,我們可以使用需要TypeReferenceObjectMapper.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM