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

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

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

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

Java

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

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

API

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

Q&A

解決済

1回答

11273閲覧

自作APIから値を取得し表示ができるAndroidアプリのエラー

ksyunnnn

総合スコア60

JSON

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

Java

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

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

API

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

0グッド

1クリップ

投稿2016/08/18 06:06

編集2016/08/18 07:13

###前提・実現したいこと
http://dev.classmethod.jp/smartphone/android/okhttp-retrofit-rxandroid/
http://qiita.com/kazuhiro1128/items/e8297557682c7f884edb
上記の記事を参考に、自作APIから値を取得し表示ができるAndroidアプリを作成しています。

###発生している問題・エラーメッセージ
下記のようなエラーが発生しアプリが動作せず、原因がわからない状況です。

E/MainActivity: Error : retrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

###該当のソースコード

  • MainActivity.java
  • EntryEntity.java
  • EntryApi.java

java

1// MainActivity.java 2package hoge.apitest; 3 4import android.os.Bundle; 5import android.support.v7.app.AppCompatActivity; 6import android.util.Log; 7import android.widget.TextView; 8 9import com.google.gson.FieldNamingPolicy; 10import com.google.gson.Gson; 11import com.google.gson.GsonBuilder; 12import com.google.gson.internal.bind.DateTypeAdapter; 13 14import java.util.Date; 15 16import retrofit.RestAdapter; 17import retrofit.android.AndroidLog; 18import retrofit.converter.GsonConverter; 19import rx.Observer; 20import rx.android.schedulers.AndroidSchedulers; 21import rx.schedulers.Schedulers; 22 23 24public class MainActivity extends AppCompatActivity { 25 26 @Override 27 protected void onCreate(Bundle savedInstanceState) { 28 super.onCreate(savedInstanceState); 29 setContentView(R.layout.activity_main); 30 31 // JSONのパーサー 32 Gson gson = new GsonBuilder() 33 .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) 34 .registerTypeAdapter(Date.class, new DateTypeAdapter()) 35 .create(); 36 37 // RESTアダプターの生成 38 RestAdapter adapter = new RestAdapter.Builder() 39 .setEndpoint("https://hoge.io") 40 .setConverter(new GsonConverter(gson)) 41 .setLogLevel(RestAdapter.LogLevel.FULL) 42 .setLog(new AndroidLog("=NETWORK=")) 43 .build(); 44 45 // 非同期処理の実行 46 adapter.create(EntryApi.class).get() 47 .subscribeOn(Schedulers.newThread()) 48 .observeOn(AndroidSchedulers.mainThread()) 49 .subscribe(new Observer<EntryEntity>() { 50 @Override 51 public void onCompleted() { 52 Log.d("MainActivity", "onCompleted()"); 53 } 54 55 @Override 56 public void onError(Throwable e) { 57 Log.e("MainActivity", "Error : " + e.toString()); 58 } 59 60 @Override 61 public void onNext(EntryEntity entry) { 62 Log.d("MainActivity", "onNext()"); 63 if (entry != null) { 64 Log.d("MainActivity", "entry != nullentry != null"+entry.entry.get(0).entry_name); 65 ((TextView) findViewById(R.id.textView)).setText(entry.entry.get(0).entry_id+" / "+entry.entry.get(0).entry_name); 66 } 67 } 68 }); 69 } 70} 71

java

1// EntryEntity.java 2package hoge.apitest; 3 4import com.google.gson.annotations.SerializedName; 5 6import java.util.List; 7 8 9/*------ For json パース ------*/ 10public class EntryEntity { 11 12 public String base ; // 何に使うかわからない 13 public List<Entry> entry ; // Entry型のArrayListクラスの宣言? (参考: http://goo.gl/Ei3Ahe ) 14 15 public class Entry { 16 @SerializedName("entry_id") 17 public String entry_id ; 18 @SerializedName("kind_name") 19 public String kind_name ; 20 @SerializedName("entry_name") 21 public String entry_name ; 22 @SerializedName("period_name") 23 public String period_name ; 24 } 25 26} 27

java

1// EntryApi.java 2 3package hoge.apitest; 4 5import retrofit.http.GET; 6import rx.Observable; 7 8 9/*------ For ... ------*/ 10public interface EntryApi { 11 @GET("/entry/api") 12 public Observable<EntryEntity> get(); 13} 14
  • 取得したいJSON

json

1[{"entry_id":"1","kind_name":"foo","entry_name":"bar","period_name":"foobar"},{"entry_id":"2","kind_name":"foo2","entry_name":"bar2","period_name":"foobar2"}]

###試したこと
【試したこと】JSONの値を下記のようにした。

json

1[{"entry_id":"1","kind_name":"foo","entry_name":"bar","period_name":"foobar"}]

※下記エラー文が「Arrayだからダメ」と言ったのかと思ったのでJSON自身を修正した

BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

【結果】
別のエラーが出た

E/MainActivity: Error : java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference

###補足情報(言語/FW/ツール等のバージョンなど)

gradle

1 2... 3 4dependencies { 5 compile 'com.android.support:appcompat-v7:23.3.0' 6 compile 'com.squareup.retrofit:retrofit:1.9.0' 7 compile 'com.squareup.okhttp:okhttp:2.3.0' 8 compile 'io.reactivex:rxandroid:0.24.0' 9 compile 'io.reactivex:rxjava:1.0.8' 10 compile 'net.danlew:android.joda:2.7.1' 11}

ひとこと

他に情報が必要であればお教えください。
なにとぞ助言いただければありがたいですm(_ _)m

※追加の質問

回答の中で、JSON文字列を配列でない状態に修正することでアプリが動作するのではないかと回答をいただき、
ご指摘の通り変更するとうまく動作ができました。ありがとうございます。

別の質問になってしまうかもしれないのですが

JSONを変更せずにJSON文字列が配列のまま
Androidアプリ側でパースし、値を表示することは可能なのでしょうか?

たとえば下記のようなJSONも配列だと思うのですが、どのように値を取得することができるのかな、、と
https://ja.epitomeup.com/feed/beam

もしよろしければご教授いただきたいですm(_ _)m

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

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

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

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

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

guest

回答1

0

ベストアンサー

送られてきているJSON文字列は配列ですね。
しかし、オブジェクトにパースしようとしているのでダメなんだと思います。
下記のJSONで試してみてください。

JSON

1{ 2 base="", 3 entry=[{"entry_id":"1","kind_name":"foo","entry_name":"bar","period_name":"foobar"},{"entry_id":"2","kind_name":"foo2","entry_name":"bar2","period_name":"foobar2"}] 4}

投稿2016/08/18 06:48

編集2016/08/18 06:49
yona

総合スコア18155

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

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

ksyunnnn

2016/08/18 07:10

いつもありがとうございます! ご指摘の通りJSON側を変更したらうまく動作しました! 別の質問になってしまうかもしれないのですが、JSONを変更せずにJSON文字列が配列のまま Androidアプリ側でパースし、値を表示することは可能なのでしょうか? たとえば下記のようなJSONも配列だと思うのですが、どのように値を取得することができるのかな、、と https://ja.epitomeup.com/feed/beam ※質問の本文にも追記させていただきます。 もしよろしければご教授いただきたいですm(_ _)m
yona

2016/08/18 07:28

回答のJSON形式間違っていませんでしたか?key=valueじゃなくてkey:valueですね。 追加について ObserverのジェネリクスをList<Entry>にすればできそうな気がしますね。
ksyunnnn

2016/08/18 08:39 編集

>回答のJSON形式間違っていませんでしたか?key=valueじゃなくてkey:valueですね。 key=valueでもkey:valueでも、動作は問題ないようでした! ただ、確かに調べるとkey:valueの表記が正しいようですね、訂正ありがとうございます! >追加について >ObserverのジェネリクスをList<Entry>にすればできそうな気がしますね。 すいません、いくらか調べたのですがご指摘いただいている内容の意図がわからず、、 質問本文の --EntryApi.java------ public interface EntryApi { @GET("/entry/api") public Observable<EntryEntity> get(); } ----------------------- を --EntryApi.java------ public interface EntryApi { @GET("/entry/api") public List<Entry> get(); } ----------------------- に変更するような意味合いでしょうか? 質問を重ねてしまい申し訳ありませんm(_ _)m
yona

2016/08/18 08:45

貴方が使っているライブラリを使ったことがないので、修正箇所を指示することができないです。ごめんなさい。 ただ、当初のJSON文字列を表すのはList<Entry>だと思います。 そのため、EntryEntityを使用している箇所をList<Entry>に変えることで対応できそうです。
ksyunnnn

2016/08/18 08:50

無理を言ってしまい申し訳ありません、大変助かりました! >EntryEntityを使用している箇所をList<Entry>に変えることで対応できそうです。 もう一度その方法で試してみます! 重なる質問にお答えいただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問