2016-11-02 72 views
0

我试图通过使用翻新2来使用服务。当我使用Web浏览器调用它或使用拦截器记录调用时,出现了一些结果,但是我的pojo类总是空的。Retrofit返回数据,但pojo对象始终为空

JSON结果内容类似于:

{ 
     "similarartists": { 
     "artist": [ 
     { 
      "name": "Barão Vermelho", 
      "mbid": "84ac395b-482b-48cb-b381-b9bc420b2dd3", 
      "match": "1", 
      "url": "https://www.last.fm/music/Bar%C3%A3o+Vermelho", 
      "image": [], 
      "streamable": "0" 
     }, 
     "@attr": { 
      "artist": "Cazuza" 
     } 
    } 
    } 

这些都是我的POJO类:

public class Similarartists { 

    @SerializedName("artist") 
    private List<Artist> artist = new ArrayList<>(); 

    @SerializedName("attr") 
    private Attr attr; 

} 

public class Artist { 

    @SerializedName("name") 
    private String name; 

    @SerializedName("mbid") 
    private String mbid; 

    @SerializedName("match") 
    private String match; 

    @SerializedName("url") 
    private String url; 

    @SerializedName("image") 
    private List<Object> image = new ArrayList<>(); 

    @SerializedName("streamable") 
    private String streamable; 
} 

public class Attr { 
    @SerializedName("artist") 
    private String artist; 
} 

服务连接类:

public class ApiService { 
    private static final String BASE_URL = "http://ws.audioscrobbler.com/"; 
    public static final String API_KEY = "XXXXXXXXXX"; 

    private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder() 
      .readTimeout(30, TimeUnit.SECONDS) 
      .connectTimeout(30, TimeUnit.SECONDS); 

    private static Retrofit.Builder builder = 
      new Retrofit.Builder() 
        .baseUrl(BASE_URL) 
        .addConverterFactory(GsonConverterFactory.create()); 

    public static <S> S createService(Class<S> serviceClass) { 
     HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 
     logging.setLevel(HttpLoggingInterceptor.Level.BODY); 

     httpClient.addInterceptor(logging); 

     httpClient.addInterceptor(new Interceptor() { 
      @Override 
      public Response intercept(Chain chain) throws IOException { 
       Request original = chain.request(); 

       // Request customization: add request headers 
       Request.Builder requestBuilder = original.newBuilder() 
         .header("Accept", "application/json") 
         .header("Content-Type", "application/json") 
         .method(original.method(), original.body()); 

       Request request = requestBuilder.build(); 
       return chain.proceed(request); 
      } 
     }); 

     Retrofit retrofit = builder.client(httpClient.build()).build(); 

     return retrofit.create(serviceClass); 
    } 

} 

答案,这是我的“按钮“动作:

private void openSearchDialog() { 
    ArtistService artistService = ApiService.createService(ArtistService.class); 
    Call<Similarartists> call = artistService.getSimilar("nirvana", ApiService.API_KEY); 
    call.enqueue(new Callback<Similarartists>() { 
     @Override 
     public void onResponse(Call<Similarartists> call, Response<Similarartists> response) { 
      if (response.isSuccessful()) { 
       mAdapter.setValues(response.body().getArtist()); 
       Log.i(TAG, "onResponse: " + response.body().toString()); 
      } 
     } 

     @Override 
     public void onFailure(Call<Similarartists> call, Throwable t) { 
      Log.e(TAG, "onFailure: ", t); 
     } 
    }); 
} 

问题是response.body()。getArtist()总是空的。请帮帮我。

这是我的日志结果:

-01 22:51:58.844 23843-24043/com.sample.pablo.hellomusic d/OkHttp:{ “similarartists”:{ “艺术家”:[{“名称“:”Hole“,”mbid“:”1dcc8968-f2cd-441c-beda-6270f70f2863“,”match“:”1“,”url“:”https://www.last.fm/music/Hole“,”image“:[{”#text“ “size”:“small”},{“#text”:“https://lastfm-img2.akamaized.net/i/u/64s/6687f63408074388ae703eb3905e238f.png”,“size”:“medium”},{“#text”:“https://lastfm-img2.akamaized.net/i/u/174s/6687f63408074388ae703eb3905e238f.png”,“size”:“large” {“#text”:“https://lastfm-img2.akamaized.net/i/u/300x300/6687f63408074388ae703eb3905e238f.png”,“size”:“extralarge”},{“#text”:“https://lastfm-img2.akamaized.net/i/u/6687f63408074388ae703eb3905e238f.png”,“size”:“mega”},{“#text”:“https://lastfm-img2.akamaized.net/i/u/arQ/6687f63408074388ae703eb3905e238f.png” “:”“}],”streamable“:”0“}],”@ attr“:{”artist“:”Nirvana“}}}

回答

1

Sinc ê存在响应JSON我认为你需要解决此对象的另一个包装,像一个的similarartists顶级键:

public class SimilarArtistsResponse { 
    @SerializedName("similarartists") 
    private Similarartists similars; 
} 

而且它的这个对象,你会在你的Call<SimilarArtistsResponse>

+0

谢谢注明!完美地工作。 –