###前提・実現したいこと
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

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/18 07:10
2016/08/18 07:28
2016/08/18 08:39 編集
2016/08/18 08:45
2016/08/18 08:50