2

この json を次のように解析して、AlbumResponse内部に別の 2 つのオブジェクトを持つという名前のオブジェクトに変換しようAlbumとしていますPaginationInfo。レトロフィット バージョン 2.0

[
    {
        "id": "6",
        "name": "King Stays King",
        "artist_name":"Timbaland",
        "image":""
    },
    {
        "id": "7",
        "name": "East Atlanta Santa 2",
        "artist_name":"Gucci Mane",
        "image":""
    },
    {
        "id": "8",
        "name": "The cuban connect",
        "artist_name":"Phophit",
        "image":""
    },
    {
        "id": "9",
        "name": "Shmoney Keeps",
        "artist_name":"Calling",
        "image":""
    },
    {
        "id": "10",
        "name": "Cabin Fever 3",
        "artist_name":"Wiz khalifa",
        "image":""
    }
],
{
    "nextPage": "http://private-ede172-mymixtapez1.apiary-mock.com/features/page_3/",
    "itemsTotal": 10,
    "page": 2,
    "pagerMax": 2
}

アルバムクラス

public class Album {
    long id;
    String name;
    @SerializedName("artist_name")
    String artistName;
    String image;
}

PaginationInfo クラス

public class PaginationInfo {
    int page;
    int pagerMax;
    int nextPage;
    int itemsTotal;
}

上記の両方のクラスを内部に持ちAlbumList

public class AlbumResponse {
    public List<Album> albums;
    public PaginationInfo paginationInfo;
}

リクエスト

Call<AlbumResponse> responseCall = albumService.features();
responseCall.enqueue(new Callback<AlbumResponse>() {
    @Override
    public void onResponse(Response<AlbumResponse> response, Retrofit retrofit) {
        if(response.isSuccess()) {
            AlbumResponse albumResponse = response.body();
            PaginationInfo paginationInfo = albumResponse.getPaginationInfo();

        }
        System.out.println();
    }

    @Override
    public void onFailure(Throwable t) {
        System.out.println(t.getMessage());
    }
});

インターフェース

public interface AlbumService {
  @GET("/features/")
  Call<AlbumResponse> features();
}

Throwable問題は、以下を含むa を取得していることです。

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: BEGIN_OBJECT が必要でしたが、1 行目と 2 列目のパス $` で BEGIN_ARRAY でした

誰かが私を助けてくれますか、スタックオーバーフローで答えが見つかりませんでした。ありがとう。

4

2 に答える 2

2

エラーは次のとおりです: パーサーは JSON オブジェクトを予期していましたが、JSON 配列を読み取りました。これを修正するには (サーバーを制御している場合)、JSON 文字列を次のように変更する必要があります。

{
  "albums" : [
    {
        "id": "6",
        "name": "King Stays King",
        "artist_name":"Timbaland",
        "image":""
    },
    {
        "id": "7",
        "name": "East Atlanta Santa 2",
        "artist_name":"Gucci Mane",
        "image":""
    },
    {
        "id": "8",
        "name": "The cuban connect",
        "artist_name":"Phophit",
        "image":""
    },
    {
        "id": "9",
        "name": "Shmoney Keeps",
        "artist_name":"Calling",
        "image":""
    },
    {
        "id": "10",
        "name": "Cabin Fever 3",
        "artist_name":"Wiz khalifa",
        "image":""
    }
],
 "paginationInfo" : {
    "nextPage": "http://private-ede172-mymixtapez1.apiary-mock.com/features/page_3/",
    "itemsTotal": 10,
    "page": 2,
    "pagerMax": 2
 }
}

これは JSON-Object であり、Java クラスに準拠しています。

バックエンドで JSON を変更できない場合は、行の応答として受け取り、GSON を使用して、または手動で と を個別albums Arrayに解析します。PaginationInfo

ところで。クラスでnextPage型を からintに変更する必要がありますStringPaginationInfo

于 2016-01-06T19:34:01.420 に答える