2016-07-31 28 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

,这是我的类选项...不张贴getter和setter ..

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; 
} 

,我试图得到这样的数据...

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()); 
} 

AAAND这是个例外......

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回报始于对象属性,“optionChain”,杰克逊试图反序列化作为HashMap,但反序列化后,您期望List

正如你所说,你只需要在JSON的“电话”和“看跌期权”,你可以用ObjectMapper.readTree让整个JsonNode,再由JsonNode.findValue找到“来电”的节点,最后反序列化的节点。以下是一个例子:

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>>() {});