[Java] Json von der URL mit der Standard-API (javax.script) abrufen und verarbeiten

Einführung

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.

Stichprobe

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

Punkt

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

[Java] Json von der URL mit der Standard-API (javax.script) abrufen und verarbeiten
Behandeln Sie die Java 8-Datums- und Uhrzeit-API mit Thymeleaf mit Spring Boot
Behandeln Sie Ausnahmen kühl mit Java 8-Lambda-Ausdrücken und der Stream-API
[Kotlin] Holen Sie sich Java Constructor / Method von KFunction und rufen Sie es auf
Greifen Sie mit Get on Android auf die Web-API zu und verarbeiten Sie Json (vorerst Java).
API-Integration von Java mit Jersey Client
JSON in Java und Jackson Teil ③ Betten Sie JSON in HTML ein und verwenden Sie es aus JavaScript
Abrufen des Werts von URL-Parametern mit Get Mapping ~ Local Date ~
[Java] Abrufen und Anzeigen des Datums 10 Tage später mithilfe der von Java 8 hinzugefügten Zeit-API.
JSON mit Java und Jackson Teil 2 XSS-Maßnahmen
[Java] Holen Sie sich Bilder mit der Google Custom Search API
[Android-Entwicklung] Holen Sie sich mit Java Bilder vom Server und legen Sie sie in ImageView fest! !!
[Java] Mit Apathce Tika Metadaten aus Dateien abrufen und Breite und Höhe von Bildern / Videos aus Metadaten abrufen [Kotlin]
Behandeln Sie JSON mit minimal-json
Memorandum Nr. 4 "Holen Sie sich eine Zeichenkette und dekorieren Sie sie" [Java]
JSON in Java und Jackson Teil 1 Gibt JSON vom Server zurück
[Java] Zeichensatz mit Apathce Tika abrufen / String von Zeichensatz initialisieren [Kotlin]
Implementieren Sie die Java-Schnittstelle in der JRuby-Klasse und rufen Sie sie von Java aus auf
Holen Sie sich Videoinformationen von Nikorepo und werfen Sie sie zu Slack
Korrigieren Sie den Zeichencode in Java und lesen Sie von der URL
Ruft Attribute und Werte aus einer XML-Datei in Java ab
Konvertieren Sie Excel mit Java in Blob, speichern Sie es, lesen Sie es aus der Datenbank und geben Sie es als Datei aus!
[Java] JSON-Kommunikation mit Jackson
Suchen und Ausführen einer Methode aus einer Instanz mit Verarbeitung (Java)
Installieren Sie das memcached Plugin unter MySQL und greifen Sie von Java aus zu
Java, JS (jQuery) und Ajax. Holen Sie sich einen bestimmten Wert von JSON.
Erhalten Sie Flux-Ergebnisse von Spring Web Flux von JS mit der Fetch-API
[Java] So konvertieren Sie vom Typ String in den Pfadtyp und erhalten den Pfad
Lesen Sie Druck und Temperatur von Raspberry Pi 3 & BMP180 mit Java ab
[Java] Geben Sie das Ergebnis von ffprobe -show_streams in JSON aus und ordnen Sie es einem Objekt in Jackson zu