JSONパースでの例外が発生して困っています。

6,364 views
Skip to first unread message

ug24k8

unread,
Oct 4, 2011, 2:33:41 PM10/4/11
to 日本Androidの会
お世話になっております。

表題の件に関してつまっており困っております。
Twitter や GoogleなどのAPIで取ってきたJSONデータを表示したいと思ってます。

Http経由でとってきたJSONデータを解析する為、
JSONObjectを作ろうとするとJSONExceptionが発生してしまいます。

デバッガやログで確認したところJSONフォーマットらしき文字列は入っているようで
なにが原因かさっぱりわからず困っています。

以下が実際の処理のコードです。
----
JSONObject getJSON() throws Exception {
StringBuilder json = new StringBuilder();

// Twitter トレンド(日本)取得接続
HttpGet httpGet = new HttpGet("http://api.twitter.com/1/trends/
23424856.json");
DefaultHttpClient http = new DefaultHttpClient();
HttpResponse execute = http.execute(httpGet);

InputStream in = execute.getEntity().getContent();
InputStreamReader reader = new InputStreamReader(in);
BufferedReader bufReader = new BufferedReader(reader);

String line;
while((line = bufReader.readLine()) != null){
Log.d("testlog", line);
//
[{"as_of":"2011-10-04T18:17:54Z","created_at":"2011-10-04T18:14:02Z","trends":
[{"url":"http:\/\/twitter.com\/search\・・・
json.append(line);
}

try {
JSONObject result = new JSONObject(json.toString());
return result;
}
catch(JSONException e) {
// JSONExceptionが発生!!
e.printStackTrace();
}
return null;
}
----

どなたか問題箇所、あるいはより良い方法をご教授いただけないでしょうか?
どうぞよろしくおねがいします。

ug24k8

unread,
Oct 4, 2011, 2:40:41 PM10/4/11
to 日本Androidの会
失礼しました。
改行失敗してしまったため見づらくなっておりますが

> //
> [{"as_of":"2011-10-04T18:17:54Z","created_at":"2011-10-04T18:14:02Z","trend s":
> [{"url":"http:\/\/twitter.com\/search\・・・

の部分は
ログに上記のようなデータが吐き出された…という意味で
1行コメントに含まれております。

元木

unread,
Oct 4, 2011, 2:48:55 PM10/4/11
to android-g...@googlegroups.com
こんばんは、元木です。

    append(line);
は、

  append(line + "\n");

としなくてもよいのでしょうか?
と思いました。

2011年10月5日3:40 ug24k8 <vya1...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。


ug24k8

unread,
Oct 5, 2011, 12:38:30 AM10/5/11
to 日本Androidの会
元木さま

ug24k8です。早速の返答ありがとうございます。

> append(line + "\n");

早速こちらの対処をいれてみましたが、結果は残念ながら変わらずでした…
ただちゃんと追いかけてみた所

> while((line = bufReader.readLine()) != null){
> Log.d("testlog", line);
> json.append(line);
> }

ここのループが1度、つまり1回ですべて取得しており、lineには2000文字オーバーの文字列がはいっていました。
(JSON書式には則っているように見えます)
また、
>"http:\/\/twitter.com\/search\/320%E5%80%8D"
といったエンコード?されたような文字が入っておりました。

もしかしたらこの辺が原因なのでしょうか?
後ほど自分でもこの辺りを調べてみようとは思いますが
なにかお気づきの点などありましたら引き続きご教授おねがいします。

よろしくお願いします。

Hiroshi SAKURAI

unread,
Oct 5, 2011, 12:51:42 AM10/5/11
to android-g...@googlegroups.com
桜井と申します。

取得している文字列は、JSONObjectではなく、JSONArrayですので、

> JSONObject result = new JSONObject(json.toString());

JSONArray result = new JSONArray(json.toString);
が正しいです。

--
Hiroshi SAKURAI

2011/10/5 ug24k8 <vya1...@gmail.com>:

ug24k8

unread,
Oct 5, 2011, 6:39:58 AM10/5/11
to 日本Androidの会
桜井さま

お世話になっております。ug24k8です。
まさに!ご指摘の通りでした。

(JSON)Objectという名称からJSONArrayはJSONObjectを基底にしたクラスだと思い込んでおりました。
とりあえずJSONArrayで統一して返すように以下のような処理にて対処したいと思います。

try {
JSONArray result = new JSONArray(json.toString());
return result;
}
catch(JSONException e) {
try {
// ルートがJSONObjectなら配列で包む。
JSONArray result = new JSONArray();
result.put(new JSONObject(json.toString()));
return result;
}
catch(JSONException e2) {
// JSONException!
e2.printStackTrace();
}
}
return null;

本当にありがとうございました。
Reply all
Reply to author
Forward
0 new messages