改造:预期 begin_array 但实际 Begin_OBJECTS

Retrofit: Expected begin_array but was Begin_OBJECTS

首先我有这个 Json 来自服务器的对象,然后我去显示曲目名称是 List Using Retrofit Lib。但是它 return 这个问题预期 BEGIN_ARRAY 但是 BEGIN_OBJECTS 在 COLOMUNS 1..

{ "toptracks" : { "@attr" : { "metro" : "Seattle",
      "page" : "1",
      "perPage" : "50",
      "total" : "500",
      "totalPages" : "10"
    },
  "track" : [ { "@attr" : { "rank" : "1" },
        "artist" : { "mbid" : "381086ea-f511-4aba-bdf9-71c753dc5077",
            "name" : "Kendrick Lamar",
            "url" : "http://www.last.fm/music/Kendrick+Lamar"
          },
        "duration" : "195",
        "image" : [ { "#text" : "http://userserve-ak.last.fm/serve/34s/103947943.png",
              "size" : "small"
            },
            { "#text" : "http://userserve-ak.last.fm/serve/64s/103947943.png",
              "size" : "medium"
            },
            { "#text" : "http://userserve-ak.last.fm/serve/126/103947943.png",
              "size" : "large"
            },
            { "#text" : "http://userserve-ak.last.fm/serve/300x300/103947943.png",
              "size" : "extralarge"
            }
          ],
        "listeners" : "122",
        "mbid" : "2d584d3c-d6ce-40ec-b23a-7b29c687ac07",
        "name" : "King Kunta",
        "streamable" : { "#text" : "0",
            "fulltrack" : "0"
          },
        "url" : "http://www.last.fm/music/Kendrick+Lamar/_/King+Kunta"
      },
      { "@attr" : { "rank" : "2" },
        "artist" : { "mbid" : "d8915e13-d67a-4aa0-9c0b-1f126af951af",
            "name" : "Hot Chip",
            "url" : "http://www.last.fm/music/Hot+Chip"
          },
        "duration" : "329",
        "image" : [ { "#text" : "http://userserve-ak.last.fm/serve/34s/103606721.gif",
              "size" : "small"
            },
            { "#text" : "http://userserve-ak.last.fm/serve/64s/103606721.gif",
              "size" : "medium"
            },
            { "#text" : "http://userserve-ak.last.fm/serve/126/103606721.gif",
              "size" : "large"
            },
            { "#text" : "http://userserve-ak.last.fm/serve/300x300/103606721.gif",
              "size" : "extralarge"
            }
          ], ...

我正在使用那些 classes:

public class Toptracks {

private List<Track> track = new ArrayList<Track>();
private Attr_ Attr;

public List<Track> getTrack() {
    return track;
} ... 

这首歌曲 class:

public class Tracks {

private Toptracks toptracks;

public Toptracks getToptracks() {
    return toptracks;
} ... 

跟踪 class:getter 和 setter ..

public class Track {

private String name;
private String duration;
private String listeners;
private String mbid;
private String url;
private Streamable streamable;
private Artist artist;


public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
} ...

我在改装界面中使用了这个功能:

@GET("/?method=geo.getmetrotrackchart...")
void getNews(Callback<List<Track>> responce);

适配器 class 用于列表中的显示名称..

public class TracksAdapter extends ArrayAdapter<Track> {

private Context context;
private List<Track> trackList;

public TracksAdapter(Context context, int resource, List<Track> objects) {
    super(context, resource, objects);
    this.context = context;
    this.trackList = objects;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.news_shape, parent, false);

    //Dispaly News..
    Track track = trackList.get(position);
    TextView newsTitle = (TextView) view.findViewById(R.id.news_title_tv);
    TextView newsDate = (TextView) view.findViewById(R.id.news_date_tv);
    TextView newsBody = (TextView) view.findViewById(R.id.news_body);

    newsTitle.setText(track.getName());
    newsDate.setText(track.getArtist().getName());

    return view;
}

最后在 MainActivity 中我称之为:

RestAdapter adapter = new RestAdapter.Builder()
            .setEndpoint(AppConfig.LAST_FM)
            .build();

    RestAPI api = adapter.create(RestAPI.class);
    api.getNews(new Callback<List<Track>>() {
        @Override
        public void success(List<Track> toptracks, Response response) {
            tracksList = toptracks;
            TrackAdapter tracksAdapter = new TracksAdapter(MainActivity.this, R.layout.news_shape, tracksList);
            setListAdapter(tracksAdapter);

        }

更改此行

@GET("/?method=geo.getmetrotrackchart...")
void getNews(Callback<List<Track>> response);

@GET("/?method=geo.getmetrotrackchart...")
void getNews(Callback<Toptracks> response);

由于您的响应以 JSONObject 开头,因此您需要使用 TopTracks class。在响应回调中做同样的改变。

已更新

YourResponse.class

public class YourResponse{

private Toptracks toptracks;

//create getter and setter....
}

设置响应

void getNews(Callback<YourResponse> response);

获取跟踪 onSuccess() 方法响应对象

  response.getToptracks().getTrack(); //will get list of tracks