Ein Memo, das ich ein wenig untersucht habe, weil ich dachte, dass ich JSON ohne die Verwendung einer Bibliothek in Java nicht einfach handhaben könnte
Ich habe es mit Java8 bestätigt und verifiziert, aber es scheint, dass javax.script von Java6 stammt.
Holen Sie sich die Wetterinformationen mit Get.
Wetter-Web-Service-Spezifikationen - Wetter-Hacks - Live-Wetterinformationen http://weather.livedoor.com/weather_hacks/webservice
Beispielklasse
public static void main(String[] args) {
try {
System.out.println("Tokio Wetter");
URL url = new URL("http://weather.livedoor.com/forecast/webservice/json/v1?city=130010");
String json;
//Holen Sie sich die Kommunikation zu String (in Klammern zu eval eingeschlossen)
try (BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));) {
json = br.lines().collect(Collectors.joining("", "(", ")"));
}// ↑ "({"forecasts":[{"dateLabel":"x",...},{"dateLabel":"y",...},...],...})"Solch eine Saite
Bindings jsObj = (Bindings) new ScriptEngineManager().getEngineByName("js").eval(json);
jsObj = (Bindings) jsObj.get("forecasts");
// get(key)Sie können es mit bekommen, aber die Rückgabe ist Objekttyp. Nach Bedarf besetzen
//js Array ist Werte()damit
jsObj.values().stream()
.map(o -> (Bindings) o)
.map(o -> o.get("dateLabel") + "\t" + o.get("telop"))
.forEach(System.out::println);
} catch (Exception e) {
e.printStackTrace();
}//Die Ausnahmebehandlung ist völlig chaotisch. Es tut uns leid.
}
Der wichtige Teil ist die Umwandlung in die Schnittstelle javax.script.Bindings.
Der Rückgabewert von ScriptEngine.eval () ist die Object-Klasse und die Instanz, in der Json von ScriptEngine [ScriptObjectMirror] ausgeführt wird (https://docs.oracle.com/javase/jp/9/docs/api/jdk/nashorn) /api/scripting/ScriptObjectMirror.html) usw. kann aufgrund von Zugriffsbeschränkungen nicht importiert und nicht umgewandelt werden. Daher gibt es viele Informationen zu Mustern, die unter vollständiger Nutzung der Reflexion ausgeführt werden.
Die von ScriptObjectMirror implementierte Bindungsschnittstelle erbt von Map \ <String, Object >. Sie können also einfach Map-Methoden wie get (String key), keySet () und values () verwenden, ohne zu viel nachzudenken. Nein, wenn Sie die Schnittstelle für Bindungen nicht kennen, können Sie sie in Map \ <?,? > Umwandeln.
Da der Schlüssel ein String ist, gibt es meines Erachtens kein bestimmtes Problem, aber die Rückgabe von get () ist auch eine Object-Klasse. Wenn Json also tief verschachtelt ist, wandeln Sie ihn mit Bindings oder Map um und bedienen Sie ihn. Das Javascript-Array scheint übrigens so gespeichert zu sein, dass auf die Schlüssel ("0", "1", "2", ...) zugegriffen werden kann, deren Indexnummer eine Zeichenfolge ist. Ich denke jedoch, dass der Zugriff zunächst mit Map.values () erfolgen sollte.
Recommended Posts