簡體   English   中英

使用Android Volley解析JSON URL-JsonObjectRequest

[英]Parse JSON URL with Android Volley - JsonObjectRequest

我正在嘗試在以下URL處解析JSON feed,但由於不斷出錯,因此不確定如何使用Volley JsonObjectRequest方法。 我相信這是因為我沒有正確地遍歷JSON對象樹,但是由於上述JSON提要,我不確定如何做到這一點。 下面是我的方法代碼。

// json object response url - Yahoo Finance
private String urlJsonObjEx = "http://finance.yahoo.com/webservice/v1/symbols/allcurrencies/quote?format=json";

private void makeJsonObjectRequest() {

    showpDialog();

    JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
            urlJsonObjEx, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            Log.d(TAG, response.toString());

            try {
                // Parsing json object response
                // response will be a json object

                String name = response.getString("name");
                String price = response.getString("price");
                String symbol = response.getString("symbol");
                String timeStamp = response.getString("ts");

                jsonResponse = "";
                jsonResponse += "Name: " + name + "\n\n";
                jsonResponse += "Price: " + price + "\n\n";
                jsonResponse += "Symbol: " + symbol + "\n\n";
                jsonResponse += "Time Stamp: " + ts + "\n\n";

                txtResponse.setText(jsonResponse);

            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(getApplicationContext(),
                        "Error: " + e.getMessage(),
                        Toast.LENGTH_LONG).show();
            }
            hidepDialog();
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
            Toast.makeText(getApplicationContext(),
                    error.getMessage(), Toast.LENGTH_SHORT).show();
            // hide the progress dialog
            hidepDialog();
        }
    });

    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(jsonObjReq);
}

我不斷收到以下錯誤:

錯誤:名稱無值

我相信這僅僅是由於name是列表中的第一個對象,而我的方法實現卻無法解析的事實。 我相信我應該使用類似於下面的代碼:

JSONObject名稱= response.getJSONObject(“名稱”);

但是我不確定。 如何實現這種方法?

下面是LogCat:

    07-06 16:28:04.636: W/System.err(14288): org.json.JSONException: No value for name
07-06 16:28:04.637: W/System.err(14288):    at org.json.JSONObject.get(JSONObject.java:389)
07-06 16:28:04.637: W/System.err(14288):    at org.json.JSONObject.getString(JSONObject.java:550)
07-06 16:28:04.637: W/System.err(14288):    at uk.co.codepix.calculator.ui.activities.CurrencyConverterCalc$3.onResponse(CurrencyConverterCalc.java:271)
07-06 16:28:04.637: W/System.err(14288):    at uk.co.codepix.calculator.ui.activities.CurrencyConverterCalc$3.onResponse(CurrencyConverterCalc.java:254)
07-06 16:28:04.637: W/System.err(14288):    at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65)
07-06 16:28:04.637: W/System.err(14288):    at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
07-06 16:28:04.637: W/System.err(14288):    at android.os.Handler.handleCallback(Handler.java:739)
07-06 16:28:04.637: W/System.err(14288):    at android.os.Handler.dispatchMessage(Handler.java:95)
07-06 16:28:04.637: W/System.err(14288):    at android.os.Looper.loop(Looper.java:135)
07-06 16:28:04.637: W/System.err(14288):    at android.app.ActivityThread.main(ActivityThread.java:5254)
07-06 16:28:04.637: W/System.err(14288):    at java.lang.reflect.Method.invoke(Native Method)
07-06 16:28:04.637: W/System.err(14288):    at java.lang.reflect.Method.invoke(Method.java:372)
07-06 16:28:04.638: W/System.err(14288):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
07-06 16:28:04.638: W/System.err(14288):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
07-06 16:28:04.653: W/InputMethodManagerService(547): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@a3c1cf8 attribute=null, token = android.os.BinderProxy@91d9236
07-06 16:28:05.033: W/ProcessCpuTracker(547): Skipping unknown process pid 15912
07-06 16:28:05.034: W/ProcessCpuTracker(547): Skipping unknown process pid 15915
07-06 16:28:05.036: W/ProcessCpuTracker(547): Skipping unknown process pid 15917
07-06 16:28:05.040: W/ProcessCpuTracker(547): Skipping unknown process pid 15918

您沒有正確訪問數據

jsonResponse = "";
JSONArray ressources = response.getJSONArray("resources");
for (int i = 0; i < jsonarray.length(); i++) {
    String name = ressources.getJSONObject(i).getJSONObject("resource").getJSONObject("fields").getString("name");
    String price = ressources.getJSONObject(i).getJSONObject("resource").getJSONObject("fields").getString("price");
    String symbol = ressources.getJSONObject(i).getJSONObject("resource").getJSONObject("fields").getString("symbol");
    String timeStamp = ressources.getJSONObject(i).getJSONObject("resource").getJSONObject("fields").getString("ts");


    jsonResponse += "Name: " + name + "\n\n";
    jsonResponse += "Price: " + price + "\n\n";
    jsonResponse += "Symbol: " + symbol + "\n\n";
    jsonResponse += "Time Stamp: " + ts + "\n\n";
}

txtResponse.setText(jsonResponse);

我把它放在一個循環中,因為它是一個對象數組。

編輯:

稍微簡化一點:

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

    JSONObject resource = ressources.getJSONObject(i).getJSONObject("resource");
    JSONObject fields = getJSONObject("fields");

    jsonResponse += "Name: " + fields.getString("name") + "\n\n";
    jsonResponse += "Price: " + fields.getString("price") + "\n\n";
    jsonResponse += "Symbol: " + fields.getString("symbol") + "\n\n";
    jsonResponse += "Time Stamp: " + fields.getString("ts") + "\n\n";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM