2015-11-30 198 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

相关问题