2015-11-30 195 views
0

這裏是我的onResponse方法爲什麼排球返回的響應對象空值

public void onResponse(SongInfo response) { 

    Log.v("TAG", "Response value is "+String.valueOf(response.artworkUrl30)); 
    // Prints "Response value is null" 
} 

String.valueOf(response.artworkUrl30))應該返回一個URL

在這裏,我建立了我的請求隊列單

Static `mRequestQueue` variable and method 

public static RequestQueue mRequestQueue; 

public static RequestQueue getRequestQueue() { 
    if (mRequestQueue == null) { 
     mRequestQueue = Volley.newRequestQueue(MainActivity.getAppContext()); 
    } 
    return mRequestQueue; 
} 

這裏我請求獲取JSON對象

(實際上有在URL多個JSON對象)

getRequestQueue(); 

String JSONURL = "https://itunes.apple.com/search?term=michael+jackson"; 

GsonRequest<SongInfo> myReq = new GsonRequest<SongInfo>(
    Request.Method.GET, 
    JSONURL, 
    SongInfo.class, 
    null, 
    createMyReqSuccessListener(), 
    createMyReqErrorListener()); 

mRequestQueue.add(myReq); 

這是我的成功響應聽者onResponse方法

private Response.Listener<SongInfo> createMyReqSuccessListener() { 
    return new Response.Listener<SongInfo>() { 
     @Override 
     public void onResponse(SongInfo response) { 
      // Do whatever you want to do with response; 
      // Like response.tags.getListing_count(); etc. etc. 

      Log.v("TAG", "This is the value of the string"+String.valueOf(response.artworkUrl30)); 
     } 
    }; 
} 

這是我的錯誤監聽

private Response.ErrorListener createMyReqErrorListener() { 
    return new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      // Do whatever you want to do with error.getMessage(); 
     } 
    }; 
} 

這是我的GsonRequest

public class GsonRequest<T> extends Request<T> { 

    private final Gson gson = new Gson(); 
    private final Class<T> clazz; 
    private final Map<String, String> headers; 
    private final Response.Listener<T> listener; // success listener 

    /** 
    * Make a GET request and return a parsed object from JSON. 
    * 
    * @param url URL of the request to make 
    * @param clazz Relevant class object, for Gson's reflection 
    * @param headers Map of request headers 
    */ 

    public GsonRequest(int method, 
         String url, 
         Class<T> clazz, 
         Map<String, String> headers, 
         Response.Listener<T> listener, // success listener 
         Response.ErrorListener errorListener) { // error listener 

     super(method, url, errorListener); // error listener 
     this.clazz = clazz; 
     this.headers = headers; 
     this.listener = listener; // success listener 
    } 

    @Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
     return headers != null ? headers : super.getHeaders(); 
    } 

    @Override 
    protected void deliverResponse(T response) { 
     listener.onResponse(response); 
    } 

    @Override 
    protected Response<T> parseNetworkResponse(NetworkResponse response) { 
     try { 
      String json = new String(
        response.data, 
        HttpHeaderParser.parseCharset(response.headers)); 
      return Response.success(
        gson.fromJson(json, clazz), 
        HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (UnsupportedEncodingException e) { 
      return Response.error(new ParseError(e)); 
     } catch (JsonSyntaxException e) { 
      return Response.error(new ParseError(e)); 
     } 
    } 
} 

這裏是

public class SongInfo { 

    public String wrapperType; 
    public String kind; 
    public Integer artistId; 
    public Integer collectionId; 
    public Integer trackId; 
    public String artistName; 
    public String collectionName; 
    public String trackName; 
    public String collectionCensoredName; 
    public String trackCensoredName; 
    public String artistViewUrl; 
    public String collectionViewUrl; 
    public String trackViewUrl; 
    public String previewUrl; 
    public String artworkUrl30; 
    public String artworkUrl60; 
    public String artworkUrl100; 
    public Float collectionPrice; 
    public Float trackPrice; 
    public String releaseDate; 
    public String collectionExplicitness; 
    public String trackExplicitness; 
    public Integer discCount; 
    public Integer discNumber; 
    public Integer trackCount; 
    public Integer trackNumber; 
    public Integer trackTimeMillis; 
    public String country; 
    public String currency; 
    public String primaryGenreName; 
    public String radioStationUrl; 
    public Boolean isStreamable; 
} 
+0

我沒那麼熟悉'GSON',但我的猜測是你試圖將你的'JSON'響應塞進一個模型('SongInfo'),這並沒有說明'artworkUrl30'在一個名爲'results'的JsonArray中。您的模型可能需要一個'List '結果字段,而'Result'對象將包含'artworkUrl30'字段。 –

回答

1

我不認爲你可以映射Json響應,如果是完全平坦的,而且所有的領域都位於位於Json層次結構的根部。

SongInfo模型也許應該是這樣的:

public class SongInfo { 

    public int resultCount; 
    public List<Results> results; 
} 

你還需要一個結果對象,像:

public class Results { 
    public String wrapperType; 
    public String kind; 
    . 
    . 
    . 
    public String artworkUrl30; 
} 
+0

那麼當我在'onReponse'方法中輸入'response'時,我的IDE將顯示atrrbutes列表,例如'response.artworkUrl30'等....我不知道這對你來說意味着什麼。 –

+0

這告訴我你的對象包含這些字段..因爲這些是你創建它時給你的對象的字段..我的答案仍然存在,我強烈建議你試試看。 –

+0

在我寫入Log.v(「TAG」,「響應值爲」+ String.valueOf(response.artworkUrl30))的onResponse方法中出現錯誤'無法解析符號response.artworkUrl30';' –

0

SongInfo類如果你期待一個JSONObject的作爲響應使用排JsonObjectRequest,否則 JsonArray作爲迴應,你必須做出凌空JsonArrayRequest。

得到響應後,Gson用SongInfo類來處理響應數據。

如果你正在考慮使用其他庫實現網絡通話,我建議你, enter link description here

+0

響應是JsonObject,問題在於GSON模型沒有以GSON能夠將數組結果映射到List的方式進行組織。 –

+0

是@TimMalseed,artWorkUrl30在Results數組內。 SongInfo類必須像你提到的那樣改變。 – HourGlass

相關問題