发布带有齐射的JSONArray并检索字符串

时间:2015-02-01 17:57:47

标签: android arrays json post android-volley

我对Android开发和使用排球有很新的想法并得到了一些问题。我试图通过Post发送一个JSONArray并尝试取回一个字符串作为响应。

我已经通过github下载了凌空文件,并在工具箱中JsonArrayRequest.java。这个文件包含了我完成任务所需的大量信息,因此我决定将其与StringRequest.java混合使用,并得到以下信息:

名为SendingJsonArray.java的新类

package com.android.volley.toolbox;

import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;

import org.json.JSONArray;
import org.json.JSONException;

import java.io.UnsupportedEncodingException;

/**
 * A request for retrieving a {@link JSONArray} response body at a given URL.
 */
public class SendingJsonArray extends JsonRequest<JSONArray> {

    /**
     * Creates a new request.
     * @param url URL to fetch the JSON from
     * @param listener Listener to receive the JSON response
     * @param errorListener Error listener, or null to ignore errors.
     */
    public SendingJsonArray(String url, JSONArray JsonArry, Listener<JSONArray> listener, ErrorListener errorListener) {
        super(Method.POST, url, JsonArry, listener, errorListener);
    }

    @Override
    protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString =
                new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            return Response.success(new JSONArray(jsonString),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }
}
  1. 第一个奇怪的是SendingJsonArray()不包含int方法?它编译并且似乎没有它。

  2. 我将Method.GET更改为Method.POST。它编译并且似乎再次起作用。

  3. 比我在"JSONArray JsonArry"中添加了SendingJsonArray并收到以下错误:

    error: no suitable constructor found for JsonRequest(int,String,JSONArray,Listener<JSONArray>,ErrorListener)
    [javac]         super(Method.POST, url, JsonArry, listener, errorListener);
    [javac]         ^
    [javac]     constructor JsonRequest.JsonRequest(int,String,String,Listener<JSONArray>,ErrorListener) is not applicable
    [javac]       (actual argument JSONArray cannot be converted to String by method invocation conversion)
    [javac]     constructor JsonRequest.JsonRequest(String,String,Listener<JSONArray>,ErrorListener) is not applicable
    [javac]       (actual and formal argument lists differ in length)
    [javac] 1 error
    
  4. 好的,我知道问题是什么,但我不知道如何解决这个问题。原始构造函数在哪里?如何修改我的构造函数?

    1. 如果我开始工作,将会有响应侦听器。我会尝试复制StringRequest.java的监听器并希望这会有效吗?

      @Override
      protected void deliverResponse(String response) {
          mListener.onResponse(response);
      }
      
      @Override
      protected Response<String> parseNetworkResponse(NetworkResponse response) {
          String parsed;
          try {
              parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
          } catch (UnsupportedEncodingException e) {
              parsed = new String(response.data);
          }
          return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
      }
      
    2. 为什么有两个,它们究竟是为什么创建的?对不起,但有关这方面的文档对我没有用处:/

      感谢您的帮助! :)

1 个答案:

答案 0 :(得分:1)

为了使用volley库发送JSONArray作为param我实现了这个名为JSONPostArrayRequest的类,它扩展了JSONRequest,也许它可以帮助你:

public class JsonPostArrayRequest extends JsonRequest<JSONObject> {

    JSONArray params;
    public JsonPostArrayRequest(String url, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener,JSONArray params) {
        super(Method.POST, url, null, listener, errorListener);
        this.params=params;
    }

     @Override
     public byte[] getBody()  {
            if ( this.params != null && this.params.length() > 0) {
                return encodeParameters( this.params, getParamsEncoding());
            }
            return null;

      }

     private byte[] encodeParameters(JSONArray params, String paramsEncoding) {
            try {
                return params.toString().getBytes(paramsEncoding);
            } catch (UnsupportedEncodingException uee) {
                throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee);
            }
        }

        @Override
        protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
            try {
                String jsonString =
                        new String(response.data, HttpHeaderParser.parseCharset(response.headers));
                return Response.success(new JSONObject(jsonString),
                        HttpHeaderParser.parseCacheHeaders(response));
            } catch (UnsupportedEncodingException e) {
                return Response.error(new ParseError(e));
            } catch (JSONException je) {
                return Response.error(new ParseError(je));
            }
        }
}