【问题标题】:get json array from web service url从 Web 服务 url 获取 json 数组
【发布时间】:2015-09-03 13:22:21
【问题描述】:

我想从我的 prestashop 网络服务中获取一些 json 对象或子数组。我可以通过带有 AppKey 的 url 在浏览器中获取我的 json。但是这个请求在 android request.my son 对象中不起作用,因为 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$3.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$1.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$2.call(AsyncTask.java:287)

【问题讨论】:

标签: android json web-services url prestashop-1.6


【解决方案1】:

你永远不会得到一个 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 完全为空。

【讨论】:

  • 我的问题是按要求得到儿子
  • 您尝试过使用loopj.com/android-async-http 吗?这是一个非常好的异步操作,只需简单的步骤即可完成所有 GET、POST、PUT、DELETE 请求。
  • 我用过,很好。但它运行 onFailure 方法。因为它不能正确地做http请求。我的请求错误响应是:B@53790420
  • loopj 响应正在使用字节......您需要将响应从字节“解析”到字符串。像这样: String str = new String(bytes, "UTF-8");并检查 API 是否正常工作。
【解决方案2】:

我解决了我的问题。这是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());
            }
}
}

【讨论】:

  • 你救了我的命!
【解决方案3】:
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);
}

【讨论】:

  • 不!它不起作用!它再次需要用户名。在浏览器中,此链接需要用户通过!我的回答成功了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多