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

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

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

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

Android

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

Q&A

1回答

3346閲覧

Retrofit、Gson、RxAndroidを使ったPOST通信でgson.JsonSyntaxExceptionが出る

Mizzet

総合スコア8

Java

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

Android

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

0グッド

0クリップ

投稿2016/01/30 09:20

初めて質問させていただきます。情報の不足がありましたら追加させていただきます。

AndroidでString型の変数(userID)を持つオブジェクト(UserEntity)をJSONデータに変換してPOSTしたいのですが、以下のエラーが出て困っています。

logcat

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $ ```> 引用テキスト 通信処理の際にRxAndroidを用いています。 HomeActivity.java ```java public class HomeActivity extends AppCompatActivity { // 通信用の定数など public static final String BASE_URL = "http://example.com/index.php"; private static final String TAG = HomeActivity.class.getSimpleName(); private Subscription subscription; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); // Gson Gson gson = new GsonBuilder() .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) .registerTypeAdapter(Date.class, new DateTypeAdapter()) .create(); // Retrofit Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create(gson)) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); // API UserApi uApi = retrofit.create(UserApi.class); // UserEntity UserEntity userInstance = new UserEntity(userID); // 非同期処理 this.subscription = uApi.createUser(userInstance) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<UserEntity>() { @Override public void onNext(UserEntity ue) { Log.d(TAG, "onNext()にきた"); } @Override public void onCompleted() { Log.d(TAG, "onComplete()にきた"); } @Override public void onError(Throwable e) { Log.e(TAG, "エラー : " + e.toString()); } }); } @Override protected void onDestroy() { // サブスクライブ解除 this.subscription.unsubscribe(); super.onDestroy(); } }

UserApi.java

java

1public interface UserApi { 2@POST("userfirst/write.json") 3public Observable<UserEntity> createUser(@Body UserEntity ue); 4}

UserEntity.java

java

1public class UserEntity { 2 3// コンストラクタ 4public UserEntity(String userID){ 5 this.userID = userID; 6} 7 8// JSONとの対応 9@Expose 10@SerializedName("user_id") 11private String userID; 12}

app/build.gradle

gradle

1dependencies { 2compile fileTree(dir: 'libs', include: ['*.jar']) 3testCompile 'junit:junit:4.12' 4compile 'com.android.support:appcompat-v7:23.0.1' 5compile 'com.google.code.gson:gson:2.4' 6compile 'com.squareup.retrofit:retrofit:2.0.0-beta2' 7compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' 8compile 'com.squareup.okhttp:okhttp:2.7.0' 9compile 'io.reactivex:rxandroid:0.24.0' 10compile 'io.reactivex:rxjava:1.1.0' 11compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2' 12compile 'io.reactivex:rxandroid:1.1.0' 13}

エラーメッセージで調べてみたものの、解決方法を探し出すことができませんでした。
どなたかわかる方がいらっしゃいましたらよろしくお願いいたします。

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

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

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

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

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

eripong

2016/01/31 09:04

例外スタックトレースを全て提示できませんか?
Mizzet

2016/01/31 11:26

すみません、自己解決しました。 追記させていただきます。
eripong

2016/01/31 12:16

了解です。
guest

回答1

0

自己解決しました。
レスポンスとして返ってくるものの型の指定が誤っていたようです。

サーバー側からはStringがレスポンスとして返ってくるので

java

1@POST("userfirst/write.json") 2public Observable<String> createUser(@Body UserEntity ue);

とすべきだったようです。

ちなみにエラー文についていろいろ調べたのでついでに載せておきます。

BEGIN_ARRAYでいうARRAYとは、

[ { }, { }, ... ]

という形であることを求められるようです。

BEGIN_OBJECTのOBJECTとは自分の定義したクラスなどのObjectのことで、各フィールドとそれに対応するArrayを持っているので

{ " " : [ ], " " : [ ], ... }

という形のJSONになっていないといけないようです。

送る前のデータをtoJSON()でJSONにしてログに出力してみてわかりました。

投稿2016/01/31 11:43

Mizzet

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問