2017-04-21 7 views
0

Ich schreibe eine Anwendung in Java, die sich mit Lagerwerten beschäftigt. Ich habe eine JSON-Datei, die wie folgt aussieht:Karte aus JSON erstellen

{ 
"Meta Data": 
{ 
    "1. Information": "Daily Prices , 
    "2. Symbol": "FB", 
    "3. Last Refreshed": "2017-04-21 10:24:00", 
    "4. Output Size": "Compact", 
    "5. Time Zone": "US/Eastern" 
}, 
"Time Series (Daily)": { 
    "2017-04-21 10:24:00": { 
     "1. open": "143.9000", 
     "2. high": "144.1700", 
     "3. low": "143.4600", 
     "4. close": "143.7800", 
     "5. volume": "2784942" 
    }, 
    "2017-04-20": { 
     "1. open": "142.9500", 
     "2. high": "144.2500", 
     "3. low": "142.6900", 
     "4. close": "143.8000", 
     "5. volume": "15917800" 
    }, 
    "2017-04-19": { 
     "1. open": "141.3500", 
     "2. high": "143.0400", 
     "3. low": "141.2700", 
     "4. close": "142.2700", 
     "5. volume": "15500400" 
    }, 
    "2017-04-18": { 
     "1. open": "141.2700", 
     "2. high": "141.9100", 
     "3. low": "140.6100", 
     "4. close": "140.9600", 
     "5. volume": "14790800" 
    } 
    } 
} 

I Liste der Bestandswerte erhalten können Gson verwenden, aber dann als JSON unsortiert ist, weiß ich nicht wirklich das Datum des spezifischen Bestandswert.

final Gson gson = new Gson(); 
    final List<String> stockValues = gson.fromJson(JSON2, JsonElement.class) 
      .getAsJsonObject() 
      .get("Time Series (Daily)") // get the divisions property 
      .getAsJsonObject() 
      .entrySet() // and traverse its key/value pairs 
      .stream() 
      .map(Entry::getValue) // discarding the keys 
      .map(JsonElement::getAsJsonObject) 
      .map(jo -> jo.get("1. open")) // take the id property from the every `division` object 
      .map(JsonElement::getAsJsonPrimitive) 
      .map(JsonPrimitive::getAsString) 
      .collect(Collectors.toList()); 

Was würde ich wirklich brauchen, ist eine Karte zu machen, die Paare von Datum enthält und Bestandswert („open“). Wie kann ich es tun?

Antwort

0

Erstens gibt es eine "fehlende nach" 1. Information ": "Daily Preise" ,. Die Lösung ist

Map<String, Map<String, Double>> map = new HashMap<>(); 

    ObjectMapper mapper = new ObjectMapper(); 
    JsonNode node = mapper.readTree(new File("path_to_json_file")); 
    JsonNode data = node.get("Time Series (Daily)"); 

    Iterator<String> iterator = data.fieldNames(); 
    while (iterator.hasNext()) { 
     String date = iterator.next(); 
     JsonNode value = data.get(date); 

     Map<String, Double> priceMap = new HashMap<>(); 
     Iterator<String> itr = value.fieldNames(); 
     while(itr.hasNext()){ 
      String param = itr.next(); 
      JsonNode price = value.get(param); 

      priceMap.put(param.replaceAll(" ", "").split("\\.")[1], price.asDouble()); 
     } 
     map.put(date, priceMap); 
    } 
    System.out.println(map); 
} 

Der Ausgang: {2017.04.18 = {volume = 1.47908E7, hoch = 141,91, low = 140,61, in der Nähe = 140,96, open = 141,27 }, 2017-04-21 10: 24: 00 = {Volumen = 2784942.0, hoch = 144.17, niedrig = 143.46, nahe = 143.78, offen = 143.9}, 2017-04-20 = {Volumen = 1.59178E7, hoch = 144.25 , niedrig = 142.69, schließen = 143.8, offen = 142.95}, 2017-04-19 = {Volumen = 1.55004E7, hoch = 143.04, niedrig = 141.27, schließen = 142.27, öffnen = 141.35}}

+1

Ihre Lösung funktioniert, Danke vielmals. –