从 Web 服务 url 获取 json 数组

get json array from web service url

我想从我的 prestashop 网络服务中获取一些 json 对象或子数组。我可以通过 url 使用 AppKey 在浏览器中获取我的 json。但是此请求在 android request.my 中无效 子对象为空,因为 http 请求无法接收它。 我的问题是如何在android中通过请求获取这个子,浏览器可以获取成功。

这是我在浏览器中的 json 回复:

{"products":[{"id":107},{"id":120},{"id":767},{"id":26},{"id":27}]}

但我无法在 android 中获取此 json,或者我的请求有误:

public class Asyncs {
JSONParser jParser = new JSONParser();
JSONArray jsonArrays = new JSONArray();

 public class GetProduct extends AsyncTask<String, String, ArrayList<String>> {

    ArrayList<String> test = new ArrayList<>();
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
    protected ArrayList<String> doInBackground(
            String... args) {
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        JSONObject json = jParser.makeHttpRequest("http://MyApp-Key@elsevan.com/api/products", "GET", params);
        Log.d(" Products: >>>>>>>>>> ", json.toString());
        try {
            for (int i = 0; i < jsonArrays.length(); i++) {
                JSONObject c = jsonArrays.getJSONObject(i);
            }

        } catch (JSONException e) {
                e.printStackTrace();
        }
        return test;
    }
    @Override
    protected void onPostExecute(final ArrayList<String> result) {

    }
}
}

我的日志:

2540-2553/? E/JSON Parser﹕ Error parsing data org.json.JSONException: End of input at character 0 of
09-03 12:43:20.444    2540-2553/? W/dalvikvm﹕ threadid=10: thread exiting with uncaught exception (group=0xa6270288)
09-03 12:43:20.444    2540-2553/? E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask.done(AsyncTask.java:299)
        at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
        at java.util.concurrent.FutureTask.run(FutureTask.java:137)
        at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:230)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
        at java.lang.Thread.run(Thread.java:856)
 Caused by: java.lang.NullPointerException
        at Requests.Asyncs$GetProduct.doInBackground(Asyncs.java:61)
        at Requests.Asyncs$GetProduct.doInBackground(Asyncs.java:31)
        at android.os.AsyncTask.call(AsyncTask.java:287)

你永远不会得到一个 json 数组,你的 "json" 应该是一个数组。如果您收到 json 响应("products" 是 Json 数组),您必须执行以下操作:

    JSONObject json = jParser.makeHttpRequest("http://MyApp-Key@elsevan.com/api/products", "GET", params);

    JSONArray json_products = json.getJSONArray("products");

    for(int i = 0; i < json_products.length(); i++ {

        JSONObject c = json_products.getJSONObject(i);

        Log.e("Object ID:", c.getString("id");
    }

还有,你检查过实际的json了吗?你得到准确的回应了吗? doInBackground 上的空指针是因为您调用的 jsonArray 完全为空。

JSONObject json = jParser.makeHttpRequest("http://MyApp-Key@elsevan.com/api/products", "GET", params);

JSONArray array = json.get("products"); 

for(int i = 0; i < jsonArray.length(); i++ {
     JSONObject c = jsonArrays.getJSONObject(i);
}

我解决了我的问题。这是 http 客户端授权:

client.setBasicAuth("MyApp-Key", "");
        client.get("http://elsevan.com/api/products/107", new JsonHttpResponseHandler(){

            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                super.onSuccess(statusCode, headers, response);
                Toast.makeText(getActivity(), "Success!", Toast.LENGTH_LONG).show();


                Log.d("android OK", response.toString());
            }
}
}