2016-07-31 5 views
0

大きなjsonファイルから特定のコレクションを取得しようとしていますが、jsonファイルにすべてのオブジェクト構造を作成したくないのは、通話」と "プット" フィールド...大きなjsonファイルから特定のコレクションを取得する方法

jsonfileはこれです:https://query2.finance.yahoo.com/v7/finance/options/AEIS?formatted=true&lang=en-US&region=US&corsDomain=finance.yahoo.com

これはゲッターとセッターを投稿していない...私のクラスのオプション..です

public class Option { 

    public enum Type { PUT, CALL } 
    @JsonIgnore 
    public Type type; 
    @JsonProperty("contractSymbol") 
    private String contractSymbol; 
    @JsonProperty("contractSize") 
    private String contractSize; 
    @JsonProperty("currency") 
    private String currency; 

    @JsonProperty("inTheMoney") 
    private boolean inTheMoney; 
    @JsonProperty("percentChange") 
    private Field percentChange; 
    @JsonProperty("strike") 
    private Field strike; 
    @JsonProperty("change") 
    private Field change; 
    @JsonProperty("impliedVolatility") 
    private Field impliedVolatility; 
    @JsonProperty("ask") 
    private Field ask; 
    @JsonProperty("bid") 
    private Field bid; 
    @JsonProperty("lastPrice") 
    private Field lastPrice; 

    @JsonProperty("volume") 
    private LongFormatField volume; 
    @JsonProperty("lastTradeDate") 
    private LongFormatField lastTradeDate; 
    @JsonProperty("expiration") 
    private LongFormatField expiration; 
    @JsonProperty("openInterest") 
    private LongFormatField openInterest; 
} 

と私は思いこのようなデータを取得しようとしています...

これは例外があるAAAND
List<Option> res = JSON_MAPPER.readValue(new URL(link), new TypeReference<List<Option>>() {}); 

for(Option o: res){ 
    o.type = Option.Type.CALL; 
    System.out.println(o.toString()); 
} 

...

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token 
    at [Source: https://query2.finance.yahoo.com/v7/finance/options/AEIS?formatted=true&lang=en-US&region=US&corsDomain=finance.yahoo.com; line: 1, column: 16] (through reference chain: java.util.HashMap["optionChain"]) 

答えて

0

問題は、ソースからのJSONの復帰はジャクソンがHashMapとしてそれを逆シリアル化しようとするオブジェクトのプロパティ、「optionChain」で始まるということですが、デシリアライズ後にListが必要です。

あなたが唯一のJSONで「通話」と「プット」が必要で述べたように、あなたがしてJsonNode.findValueで「呼び出し」のノードを見つけ、最初の全体JsonNodeを取得するためにObjectMapper.readTreeを使用し、最終的にノードをデシリアライズすることができます。以下は例です:

String link = "https://query2.finance.yahoo" + 
      ".com/v7/finance/options/AEIS?formatted=true&lang=en-US&region=US&corsDomain=finance.yahoo.com"; 
ObjectMapper mapper = new ObjectMapper(); 
JsonNode jsonNode = mapper.readTree(new URL(link)); 
JsonNode calls = jsonNode.findValue("calls"); 
List<Option> callOptions = mapper.readValue(calls.traverse(), new TypeReference<List<Option>>() {}); 
関連する問題