Un mémo que j'ai un peu étudié car je pensais que je ne pourrais pas facilement gérer JSON sans utiliser une bibliothèque en Java
Je l'ai confirmé et vérifié avec Java8, mais il semble que javax.script provienne de Java6.
Obtenez les informations météorologiques avec Get.
Spécifications du service Web météo --Weather Hacks --Informations météorologiques http://weather.livedoor.com/weather_hacks/webservice
Exemple de classe
public static void main(String[] args) {
try {
System.out.println("Le temps à Tokyo");
URL url = new URL("http://weather.livedoor.com/forecast/webservice/json/v1?city=130010");
String json;
//Obtenir la communication vers String (entre parenthèses pour évaluer)
try (BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));) {
json = br.lines().collect(Collectors.joining("", "(", ")"));
}// ↑ "({"forecasts":[{"dateLabel":"x",...},{"dateLabel":"y",...},...],...})"Une telle chaîne
Bindings jsObj = (Bindings) new ScriptEngineManager().getEngineByName("js").eval(json);
jsObj = (Bindings) jsObj.get("forecasts");
// get(key)Vous pouvez l'obtenir avec, mais le retour est de type Object. Cast au besoin
//Le tableau js est des valeurs()alors
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();
}//La gestion des exceptions est complètement compliquée. Pardon.
}
La partie importante est la conversion vers l'interface javax.script.Bindings.
La valeur de retour de ScriptEngine.eval () est la classe Object et l'instance lorsque Json est exécuté par ScriptEngine [ScriptObjectMirror](https://docs.oracle.com/javase/jp/9/docs/api/jdk/nashorn /api/scripting/ScriptObjectMirror.html) etc. ne peuvent pas être importés en raison de restrictions d'accès et ne peuvent pas être castés, il y a donc beaucoup d'informations sur les modèles qui sont exploités en utilisant pleinement la réflexion.
L'interface Bindings implémentée par ScriptObjectMirror hérite de Map \ <String, Object >. Vous pouvez donc simplement utiliser des méthodes Map telles que get (String key), keySet (), values () sans trop réfléchir. Non, si vous ne savez pas ce qu'est l'interface Bindings, vous pouvez la convertir en Map \ <?,? >.
Puisque la clé est une chaîne, je ne pense pas qu'il y ait de problème, mais le retour de get () est également une classe Object, donc si Json est profondément imbriqué, lancez-le avec Bindings ou Map et utilisez-le. Au fait, le tableau javascript semble être stocké pour être accessible par les touches ("0", "1", "2", ...) dont le numéro d'index est une chaîne de caractères. Cependant, je pense qu'il devrait être accédé en utilisant Map.values () en premier lieu.