質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

3520閲覧

Java8のnashornエンジンを使ってjsonをHashMapに変換した際にNullPointerException発生

Chironnup

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2018/07/15 11:33

編集2018/07/15 12:22

前提・実現したいこと

Java8で、OpenWeatherMap(https://openweathermap.org/)のAPIを叩いて天気の情報をJSONで取得して、
nashornエンジンを使ってHashMapに格納し出力するプログラムを書いていたのですが、
NullPointerExceptionが出てしまったので、自分でも調べている途中ですが
もしわかる方がいらっしゃればその方が早いのでこちらでも質問します。

WebAPI関係のコードを書くのは初めてなので後半部分のnashornエンジンを利用してHashMapに格納するところは
こちらのサイト(https://www.sejuku.net/blog/39599)のコードほぼそのままです。

初歩的な問題やもしれませんがご助力いただけると幸いです。

.
.

発生している問題・エラーメッセージ

{"coord":{"lon":139.76,"lat":35.68},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01d"}],"base":"stations","main":{"temp":29.36,"pressure":1013,"humidity":74,"temp_min":29,"temp_max":30},"visibility":16093,"wind":{"speed":4.1,"deg":190},"clouds":{"all":1},"dt":1531648560,"sys":{"type":1,"id":7622,"message":0.0078,"country":"JP","sunrise":1531596991,"sunset":1531648623},"id":1850147,"name":"Tokyo","cod":200} java.lang.NullPointerException at WeatherTest.main(WeatherTest.java:44)

.

該当のソースコード

Java

1import java.io.*; 2import java.net.*; 3import java.lang.reflect.Method; 4import java.util.*; 5 6import javax.script.ScriptEngine; 7import javax.script.ScriptEngineManager; 8 9 10 11public class WeatherTest{ 12 public static void main(String[] args) 13 { 14 String BASE_URL="http://api.openweathermap.org/data/2.5/weather"; 15 String CITY="Tokyo"; 16 String API_KEY="XXXX"; 17 18 String url=BASE_URL+"?q="+CITY+",jp&units=metric&appid="+API_KEY; 19 20 String line="";//json格納用配列 21 try { 22 // HTTP接続を確立し,処理要求を送る 23 HttpURLConnection conn = (HttpURLConnection)(new URL(url)).openConnection(); 24 conn.connect(); 25 26 //WebAPIから結果を出力 27 BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8")); 28 while( (line = br.readLine()) != null) { 29 System.out.println(line); 30 } 31 br.close(); 32 conn.disconnect(); 33 } catch (IOException ex) { 34 ex.printStackTrace(); 35 } 36 37 //jsonをhashmapに格納して出力 38 ScriptEngineManager manager = new ScriptEngineManager(); 39 ScriptEngine engine = manager.getEngineByName("nashorn"); 40 41 try { 42 Object obj = engine.eval(String.format("(%s)", line)); 43 Class scriptClass = Class.forName("jdk.nashorn.api.scripting.ScriptObjectMirror"); 44 Object[] keys = ((java.util.Set)obj.getClass().getMethod("keySet").invoke(obj)).toArray();//44行目 45 Method method_get = obj.getClass().getMethod("get", Class.forName("java.lang.Object")); 46 47 Map<String, String> map = new HashMap<>(); 48 for(Object key : keys) { 49 Object val = method_get.invoke(obj, key); 50 map.put(key.toString(), val.toString()); 51 } 52 53 System.out.println(map); 54 } catch(Exception e) { 55 e.printStackTrace(); 56 } 57 58 } 59} 60

追記

回答ですでに指摘していただいたのですが、このプログラムでnashornエンジンを使っているのには事情がありまして、
このプログラムを使う本番環境が、クラスパスを簡単に設定できないかもしれない(未確認)ので
なるべく標準ライブラリだけで記述したかったのです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

現在出ているエラーの解決ではないですが
nashornを使用するのは、jsonをmapにする目的だけですか?
それであればnashornは今後非推奨となるのでやめたほうが良いかと思います。
JavaでJavaScriptを実行する「Nashorn」が非推奨に、ECMAScriptの速い進化に追いつけないと。代替案はGraalVM

Json文字列をJavaのMapに変換する目的であればJacksonを使用するのはどうでしょうか?

【参考】jackson for javaによる json → Map<String,Object> map 変換

投稿2018/07/15 11:53

euledge

総合スコア2404

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironnup

2018/07/15 12:15

回答ありがとうございます! このプログラムは別のプログラムの一部なのですが、 本番の実行環境がもしかしたらクラスパス等が使えないかもしれない環境なので 標準ライブラリだけのプログラムを書きたかったんです。 とりあえずjacksonで実装してみようと思います。 マッハ回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問