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

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

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

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

Java

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

Android

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

Q&A

解決済

2回答

8397閲覧

androidでサーバから受け取ったJSONオブジェクトがjava.lang.IllegalStateExceptionで止まる

femto6

総合スコア18

JSON

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

Java

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

Android

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

0グッド

0クリップ

投稿2016/10/12 09:19

現在、androidでアプリの開発をしております。
今はテストとしてアプリ起動時にサーバにリクエストを飛ばし、レスポンスとしてJSONオブジェクトを取得するようになっています。
そのレスポンスにあるJSONオブジェクトをターミナルに表示しようとする段階でタイトルのエラーになります。

エラーのスタックトレースは以下になります

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 7915 path $.images[0] at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224) at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37) at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25) at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:117) at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:211) at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:106) at okhttp3.RealCall$AsyncCall.execute(RealCall.java:126) at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 7915 path $.images[0] at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:80) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)

JSONの設計は以下になります

javascript

1{ 2 service:[], 3 name: [], 4 url: [], 5 images: [ 6 [ 7 { 8 ImageUrl:"" 9 }, 10 { 11 ImageUrl:"" 12 }, //可変長で複数取得 13 ], 14 [ 15 { 16 ImageUrl:"" 17 } 18 { 19 IMageUrl:"" 20 }, //同上 21 ], //配列も複数取得される。数は不定 22 ], 23 price: [] 24}

受け取ったJSONを処理するJavaのクラスは以下です。

Java

1 2@Generated("org.jsonschema2pojo") 3public class RandomUserDemo { 4 5 @SerializedName("service") 6 @Expose 7 public List<String> service = new ArrayList<String>(); 8 @SerializedName("name") 9 @Expose 10 public List<String> name = new ArrayList<String>(); 11 @SerializedName("url") 12 @Expose 13 public List<String> url = new ArrayList<String>(); 14 @SerializedName("images") 15 @Expose 16 public List<List<Image>> images = new ArrayList<List<Image>>(); 17 @SerializedName("price") 18 @Expose 19 public List<String> price = new ArrayList<String>(); 20 21} 22@Generated("org.jsonschema2pojo") 23class Image { 24 25 @SerializedName("imageUrl") 26 @Expose 27 public String imageUrl; 28 29}

あとは起動時にターミナルにそれぞれのデータを表示する処理を書いています。
また、今のままでも時々はエラーせずにデータが表示されるのですが、大抵の場合はエラーになります。
取得するデータは毎回同じです。

原因、または解決方法がわかりましたらよろしくお願いします。

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

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

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

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

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

guest

回答2

0

そのJSONは一例なのでしょうか?単に書き間違えだとは思いますが、一箇所カンマが足りてなかったので一応。

Javascript

1{ 2 service:[], 3 name: [], 4 url: [], 5 images: [ 6 [ 7 { 8 ImageUrl:"" 9 }, 10 { 11 ImageUrl:"" 12 }, //可変長で複数取得 13 ], 14 [ 15 { 16 ImageUrl:"" 17 } // ここ、カンマが足りない。 18 { 19 IMageUrl:"" 20 }, //同上 21 ], //配列も複数取得される。数は不定 22 ], 23 price: [] 24}

投稿2016/10/12 09:51

編集2016/10/12 09:52
ishi9

総合スコア1294

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

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

femto6

2016/10/13 07:13

直に書いていたので書き間違えてしまいました。失礼しました。
guest

0

ベストアンサー

パースする文字列の内容が配列を期待しているようですが、実際は文字列が帰ってきているようです。

Androidの問題ではなさそうなので、まずはどのような文字列が帰ってきているかを確認しましょう。

投稿2016/10/12 09:29

yona

総合スコア18155

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

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

femto6

2016/10/13 07:47

確認してみたところ、たしかに配列で渡してくるデータと文字列として渡してくるデータが存在していることが分かりました。ですので、サーバ側が取得するデータを文字列に制限しておくことで解決することができました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問