java - 在 Android Studio 中解析 JSON 对象

标签 java android json parsing

我正尝试在 Android Studio 中解析此 JSON 链接,但出现错误 E/ServiceHandler:无法从 url 获取任何数据。 https://api.jivedata.com/financials/detail/?ticker=aapl&elements=price_to_earnings

这是我的 MainActivity.java

package claudio.jivedatapeparsing;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

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

import java.util.ArrayList;
import java.util.HashMap;


    private static String url = "https://api.jivedata.com/financials/detail/?ticker=aapl&elements=price_to_earnings";

    // JSON Node names
    private static final String TAG_VALUE = "value";
    private static final String TAG_TOTAL = "_total_";
    private static final String TAG_RESULTS = "_results_";
    private static final String TAG_PRICETOEARNINGS = "price_to_earnings";



    JSONArray _total_ = null;

    // Hashmap for ListView
    // Hashmap is an implementation of map
    ArrayList<HashMap<String, Integer>> contactList;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        contactList = new ArrayList<HashMap<String, Integer>>();

        ListView lv = getListView();
        new GetContacts().execute();
    }

    private class GetContacts extends AsyncTask<Void, Void, Void> {

        //before it executes
        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Please wait...");

            pDialog.setCancelable(false);
            pDialog.show();

        }

        @Override
        protected Void doInBackground(Void... arg0) {

            ServiceHandler sh = new ServiceHandler();


            String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);

            Log.d("Response: ", "> " + jsonStr);

            if (jsonStr != null) {
                try {
                    JSONObject jsonObject = new JSONObject(jsonStr);
                    JSONObject _results_ = jsonObject.getJSONObject(TAG_RESULTS);
                    JSONObject price_to_earnings = _results_.getJSONObject(TAG_PRICETOEARNINGS);
                    JSONArray _total_ = price_to_earnings.getJSONArray(TAG_TOTAL);


                    for (int i = 0; i < _total_.length(); i++) {
                        JSONObject c = _total_.getJSONObject(31);//get the latest P/E value

                         int value = c.getInt(TAG_VALUE);

                        HashMap<String, Integer> contact = new HashMap<String, Integer>();


                        contact.put(TAG_VALUE, value);

                        contactList.add(contact);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } else {
                Log.e("ServiceHandler", "Couldn't get any data from the url");
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            if (pDialog.isShowing())
                pDialog.dismiss();


            ListAdapter adapter = new SimpleAdapter(
                    MainActivity.this, contactList,
                    R.layout.list_item, new String[] { TAG_VALUE }, new int[] { R.id.value });

            setListAdapter(adapter);
        }

    }

}

这是 ServiceHandler.java:

package claudio.jivedatapeparsing;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public class ServiceHandler {

    static String response = null;
    public final static int GET = 1;
    public final static int POST = 2;

    public ServiceHandler() {

    }

    /**
     * Making service call
     * @url - url to make request
     * @method - http request method
     * */
    public String makeServiceCall(String url, int method) {
        return this.makeServiceCall(url, method, null);
    }

    /**
     * Making service call
     * @url - url to make request
     * @method - http request method
     * @params - http request params
     * */
    public String makeServiceCall(String url, int method,
                                  List<NameValuePair> params) {
        try {
            // http client
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpEntity httpEntity = null;
            HttpResponse httpResponse = null;

            // Checking http request method type
            if (method == POST) {
                HttpPost httpPost = new HttpPost(url);
                // adding post params
                if (params != null) {
                    httpPost.setEntity(new UrlEncodedFormEntity(params));
                }

                httpResponse = httpClient.execute(httpPost);

            } else if (method == GET) {

                if (params != null) {
                    String paramString = URLEncodedUtils
                            .format(params, "utf-8");
                    url += "?" + paramString;
                }
                HttpGet httpGet = new HttpGet(url);

                httpResponse = httpClient.execute(httpGet);

            }
            httpEntity = httpResponse.getEntity();
            response = EntityUtils.toString(httpEntity);

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return response;

    }
}

最佳答案

编辑:我能够修改 ServiceHandler.java 类以使用 HTTPUrlConnection 而不是旧的 API,并且它起作用了。

修改后的 ServiceHandler.java:

import org.apache.http.NameValuePair;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

public class ServiceHandler {

    static String response = null;
    public final static int GET = 1;
    public final static int POST = 2;

    HttpURLConnection urlConnection;

    public ServiceHandler() {

    }

    /**
     * Making service call
     * @url - url to make request
     * @method - http request method
     * */
    public String makeServiceCall(String url, int method) {
        return this.makeServiceCall(url, method, null);
    }

    /**
     * Making service call
     * @url - url to make request
     * @method - http request method
     * @params - http request params
     * */
    public String makeServiceCall(String url, int method,
                                  List<NameValuePair> params) {
        StringBuilder result = new StringBuilder();


        try {
            URL urlObj = new URL(url);
            urlConnection = (HttpURLConnection) urlObj.openConnection();
            InputStream in = new BufferedInputStream(urlConnection.getInputStream());

            BufferedReader reader = new BufferedReader(new InputStreamReader(in));

            String line;
            while ((line = reader.readLine()) != null) {
                result.append(line);
            }

        }catch( Exception e) {
            e.printStackTrace();
        }
        finally {
            urlConnection.disconnect();
        }


        return result.toString();
    }
}

MainActivity.java 中的响应日志:

04-10 17:00:00.351  22478-22517/com.networkjsontest.danu.networkjsontest D/Response:﹕ > {"_results_": {"_dates_": [{"end": "2009-09-26", "length": 12, "start": "2008-09-28"}, {"end": "2009-12-26", "length": 3, "start": "2009-09-27"}, {"end": "2010-03-27", "length": 3, "start": "2009-12-27"}, {"end": "2010-06-26", "length": 3, "start": "2010-03-28"}, {"end": "2010-06-26", "length": 9, "start": "2009-09-27"}, {"end": "2010-09-25", "length": 3, "start": "2010-06-27"}, {"end": "2010-09-25", "length": 12, "start": "2009-09-27"}, {"end": "2010-12-25", "length": 3, "start": "2010-09-26"}, {"end": "2011-03-26", "length": 3, "start": "2010-12-26"}, {"end": "2011-03-26", "length": 6, "start": "2010-09-26"}, {"end": "2011-06-25", "length": 3, "start": "2011-03-27"}, {"end": "2011-06-25", "length": 9, "start": "2010-09-26"}, {"end": "2011-09-24", "length": 3, "start": "2011-06-26"}, {"end": "2011-09-24", "length": 12, "start": "2010-09-26"}, {"end": "2011-12-31", "length": 3, "start": "2011-09-25"}, {"end": "2012-03-31", "length": 3, "start": "2012-01-01"}, {"end": "2012-03-31", "length": 6, "start": "2011-09-25"}, {"end": "2012-06-30", "length": 3, "start": "2012-04-01"}, {"end": "2012-06-30", "length": 9, "start": "2011-09-25"}, {"end": "2012-09-29", "length": 3, "start": "2012-07-01"}, {"end": "2012-09-29", "length": 12, "start": "2011-09-25"}, {"end": "2012-12-29", "length": 3, "start": "2012-09-30"}, {"end": "2013-03-30", "length": 3, "start": "2012-12-30"}, {"end": "2013-03-30", "length": 6, "start": "2012-09-30"}, {"end": "2013-06-29", "length": 3, "start": "2013-03-31"}, {"end": "2013-06-29", "length": 9, "start": "2012-09-30"}, {"end": "2013-09-28", "length": 3, "start": "2013-06-30"}, {"end": "2013-09-28", "length": 12, "start": "2012-09-30"}, {"end": "2013-12-28", "length": 3, "start": "2013-09-29"}, {"end": "2014-03-29", "length": 3, "start": "2013-12-29"}, {"end": "2014-03-29", "length": 6, "start": "2013-09-29"}, {"calculated": "LTM", "end": "2014-03-29", "length": 12, "start": "2013-03-31"}], "_labels_": {"price_to_earnings": "Price/Earnings"}, "price_to_earnings": {"_total_": [{"formatted": "86.5x", "value": 86.46023072252581}, {"formatted": "210.8x", "value": 210.7756068679692}, {"formatted": "231.6x", "value": 231.62003903708523}, {"formatted": "218.9x", "value": 218.87488472179527}, {"formatted": "73.4x", "value": 73.36424523441525}, {"formatted": "165.3x", "value": 165.27390900649954}, {"formatted": "50.8x", "value": 50.80996217797759}, {"formatted": "118.6x", "value": 118.58760826115923}, {"formatted": "118.9x", "value": 118.9243360614665}, {"formatted": "59.4x", "value": 59.37786673338337}, {"formatted": "97.4x", "value": 97.42747673782156}, {"formatted": "36.9x", "value": 36.893103269599465}, {"formatted": "107.5x", "value": 107.50415219688962}, {"formatted": "27.5x", "value": 27.467016433917134}, {"formatted": "54.5x", "value": 54.5009185548071}, {"formatted": "61.3x", "value": 61.26312166580623}, {"formatted": "28.8x", "value": 28.842258770153123}, {"formatted": "80.7x", "value": 80.68902991840436}, {"formatted": "21.2x", "value": 21.247388839152492}, {"formatted": "86.6x", "value": 86.58640398881187}, {"formatted": "17.1x", "value": 17.06083914408262}, {"formatted": "54.4x", "value": 54.442575317326806}, {"formatted": "74.6x", "value": 74.57840159212319}, {"formatted": "31.5x", "value": 31.46961325966851}, {"formatted": "103.2x", "value": 103.18840579710145}, {"formatted": "24.1x", "value": 24.115156646909398}, {"formatted": "94.8x", "value": 94.78168264110757}, {"formatted": "19.2x", "value": 19.224019224019223}, {"formatted": "54.5x", "value": 54.467564259485926}, {"formatted": "69.6x", "value": 69.64687469431674}, {"formatted": "30.6x", "value": 30.56449881948916}, {"formatted": "18.9x", "value": 18.882435622033043}]}}}

请注意,您的 JSON 解析代码没有正确解析它,因此您还有一些工作要做。

关于java - 在 Android Studio 中解析 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29570571/

相关文章:

Java - 比较器来搜索子字符串

java - 运算符 * 未定义

android - 如何获取 fragment 方法内已实现回调的上下文

javascript - 从数组javascript中删除对象

java - 从 JSON API 获取数据并循环放入 CSV

java - JDBC SQL - 如何分解一系列值,例如保存001-保存100?

java - 对话框中的 EditText 值

android - 带有Delphi Android应用程序的Socket

android - GDK 与谷歌地图 View

java - 如何为 Rest Assured 3.0.3 声明默认解析器(使用 Java 和 TestNG)?