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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

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

Q&A

解決済

1回答

3197閲覧

JSONObjectのコンストラクタへの引数

Chironnup

総合スコア11

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

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

0グッド

0クリップ

投稿2018/07/16 03:46

前提・実現したいこと

Java8でOpenWeatherMapのAPIを叩いてレスポンスとしてもらったJSONを
JsonInJavaのJSONObjectを使ってHashMapに変換して出力するというプログラムを書いていたのですが、下のようなエラーがでてしまったので解決策を教えていただきたいです。

「JSONObjectのコンストラクタへ渡す引数の型が間違ってるよ」っていうエラーだと思うんですけど、参考にしたこちらのサイト(https://www.sejuku.net/blog/39599)でもString型の引数を渡しているので正直お手上げ状態です。

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

{"coord":{"lon":139.76,"lat":35.68},"weather":[{"id":801,"main":"Clouds","description":"few clouds","icon":"02d"}],"base":"stations","main":{"temp":32.4,"pressure":1013,"humidity":56,"temp_min":30,"temp_max":34},"visibility":16093,"wind":{"speed":2.6,"deg":120},"clouds":{"all":20},"dt":1531709760,"sys":{"type":1,"id":7622,"message":0.0088,"country":"JP","sunrise":1531683419,"sunset":1531735002},"id":1850147,"name":"Tokyo","cod":200} Exception in thread "main" java.lang.NullPointerException at java.io.StringReader.<init>(Unknown Source) at org.json.JSONTokener.<init>(JSONTokener.java:94) at org.json.JSONObject.<init>(JSONObject.java:357) at WeatherTest3.main(WeatherTest3.java:35)

該当のソースコード

import java.io.*; import java.net.*; import java.util.*; import org.json.JSONObject; public class WeatherTest3{ public static void main(String[] args) { String BASE_URL="http://api.openweathermap.org/data/2.5/weather"; String CITY="Tokyo"; String API_KEY="XXXX"; String url=BASE_URL+"?q="+CITY+",jp&units=metric&appid="+API_KEY; String line="";//json格納用配列 try { // HTTP接続を確立し,処理要求を送る HttpURLConnection conn = (HttpURLConnection)(new URL(url)).openConnection(); conn.connect(); //WebAPIから結果を出力 BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8")); while( (line = br.readLine()) != null) { System.out.println(line);//出力1 } br.close(); conn.disconnect(); } catch (IOException ex) { ex.printStackTrace(); } JSONObject obj = new JSONObject(line);//35行目 Map<String, Object> map = new HashMap<>(); for(Object key : obj.keySet()) { map.put((String) key, obj.get((String) key)); } System.out.println(map); } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

java

1 while( (line = br.readLine()) != null) { 2 System.out.println(line);//出力1 3 }

のなかでセットされているのでwhile抜けた場合は最後の行の文字列になりますよ。

JSONObject obj = new JSONObject(line);//35行目

を行っていますが、この場所でlineには何が入っていますか?
34行目でSystem.out.println(line);やってみたらわかると思いますよ。

jsonが複数行に分かれてくるのであれば、すべての行の文字列を連結させたものを引数に渡す必要がありますね。

投稿2018/07/16 04:56

編集2018/07/16 04:57
euledge

総合スコア2404

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

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

Chironnup

2018/07/16 05:03

冷静になって考えてみればWhileの終了条件にnull文字を指定しているんだからそりゃlineにはnull入ってるだろって話ですね。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問