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

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

ただいまの
回答率

88.04%

JSONデータを型が合わず取得できません。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 947

score 409

前提・実現したいこと

RailsAPIでJSONデータを吐き出し、Androidアプリで取得したいです。
吐き出したJSONデータの型とAndroid側の取得するための型が一致せずエラーになりました。

発生している問題・エラーメッセージ

06-01 16:54:40.426 19350-19350/station.around.aroundsatation D/debug4: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

該当のソースコード

APIが吐き出すJSONデータ

[{"id":1,"en_title":"http://i.imgur.com/9h81ns6.jpg","ja_title":"新宿駅 東口","en_content":"FirstKitchen Mac Wi-fi","ja_content":"ファーストキッチン マクドナルド ワイファイ","url":{"url":null},"created_at":"2017-05-28T06:43:53.150Z","updated_at":"2017-05-30T04:54:06.455Z"},{"id":2,"en_title":"kamkack;m","ja_title":"mlcdm;kacm;k","en_content":"mcsamk;casm;","ja_content":";dc,lacsl;,","url":{"url":null},"created_at":"2017-05-30T05:31:13.344Z","updated_at":"2017-05-30T05:31:13.344Z"},{"id":3,"en_title":"lmascml;cal;","ja_title":"mcmaclm","en_content":"lm;dcmkdckm","ja_content":"lcdm;cdlm;","url":{"url":null},"created_at":"2017-05-30T05:31:25.030Z","updated_at":"2017-05-30T05:31:25.030Z"},{"id":4,"en_title":"lm;ac;mdc;lm","ja_title":"l;c;lmclm;","en_content":"lddkm","ja_content":"llm;dc;lm","url":{"url":null},"created_at":"2017-05-30T05:31:35.457Z","updated_at":"2017-05-30T05:31:35.457Z"},{"id":5,"en_title":"l;dcmk;dck;","ja_title":"l;msckck;","en_content":"dckmadkm","ja_content":"klmckldc","url":{"url":null},"created_at":"2017-05-30T05:31:46.043Z","updated_at":"2017-05-30T05:31:46.043Z"}]

 ImageClient.java

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Path;
import station.around.aroundsatation.model.ListImage;

public interface ImageClient {
    @GET("/api/v1/images")
    Call<ListImage> listImages();
}

 ListImage.java

import java.util.List;

public class ListImage {
    public List<Image> image;

    public List<Image> getListImages() {
        return image;
    }
}

MainActivity

    private void showMember(){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://candii.tk/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        ImageClient service = retrofit.create(ImageClient.class);


        Call<ListImage> call2 = service.listImages();
        call2.enqueue(new Callback<ListImage>() {
            @Override
            public void onResponse(Call<ListImage> call, Response<ListImage> response) {
                List<Image> listImage = response.body().getListImages();
                int s = listImage.size();
                for(int i = 0; i < s; i++){
                    Log.d("debug3", listImage.get(i).getEn_title());
                }

            }

            @Override
            public void onFailure(Call<ListImage> call, Throwable t) {
                Log.d("debug4", t.getMessage());
            }
        });
    }

どのようにJSONデータ型に対応するか検討がつかず質問させていただきます。
ご経験ある方、ご指南お願いします!

 追加

 エラー内容

Error:(42, 51) エラー: 不適合な型: Call<List<ListImage>>をCall<ListImage>に変換できません:
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.

 エラー箇所

MainActivity.java

public class MainActivity extends AppCompatActivity {

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

    private void showMember(){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://candii.tk/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        ImageClient service = retrofit.create(ImageClient.class);


        Call <ListImage> call2 = service.listImages(); ★ここです。★
        call2.enqueue(new Callback<ListImage>() {
            @Override
            public void onResponse(Call<ListImage> call, Response<ListImage> response) {
                List<Image> listImage = response.body().getListImages();
                int s = listImage.size();
                for(int i = 0; i < s; i++){
                    Log.d("debug3", listImage.get(i).getEn_title());
                }

            }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

使ったことないので推測です。

Call<ListImage> listImages();


ではなく、下記ではないでしょうか。

Call<List<ListImage>> listImages();

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/01 18:22

    回答で変更した内容はクラスを使用する全箇所に影響がでます。
    併せて修正して試してください。

    キャンセル

  • 2017/06/01 18:49

    わかりました!

    キャンセル

  • 2017/06/01 19:44

    型変換を調整できました!
    ありがとうございます!

    キャンセル

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

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る