【问题标题】:Retrofit: Expected begin_array but was Begin_OBJECTS改造:预期 begin_array 但 Begin_OBJECTS
【发布时间】:2015-05-29 12:00:42
【问题描述】:

首先我有这个来自服务器的 Json 对象,然后我去显示轨道名称是 List Using Retrofit Lib。但它返回这个问题 EXPECTED BEGIN_ARRAY 但 WAS BEGIN_OBJECTS AT 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"
            }
          ], ...

我正在使用这些类:

public class Toptracks {

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

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

还有这个 Tracks 类:

public class Tracks {

private Toptracks toptracks;

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

跟踪类: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);

列表中显示名称的适配器类..

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);

        }

【问题讨论】:

    标签: android api retrofit


    【解决方案1】:

    改变这一行

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

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

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

    更新

    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
    

    【讨论】:

    • 以及如何更改适配器以在列表中显示曲目名称
    猜你喜欢
    • 2015-07-24
    • 1970-01-01
    • 2014-08-01
    • 2020-02-10
    • 2015-11-26
    • 2016-01-27
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多