【问题标题】:Android JSON Parsing using API使用 API 解析 Android JSON
【发布时间】:2012-04-01 06:51:43
【问题描述】:

我很难弄清楚如何正确解析这个 JSON 文件。

{
    "count": 10, 
    "timestamp": 1333243153, 
    "total": 100, 
    "diggs": [
        {
            "date": 1333243146, 
            "item": {
                "status": "upcoming", 
                "container": {
                    "name": "Politics", 
                    "short_name": "politics"
                }, 
                "description": "Major steps toward the disestablishment of Norway's state church, the (Lutheran) Church of Norway, were passed by the government on March 16 in its weekly session with King Harald V.", 
                "title": "National Secular Society - Norway continues the long process of disestablishing the Lutheran Church", 
                "submit_date": 1333206325, 
                "media": 0, 
                "diggs": 5, 
                "comments": 0, 
                "topic": {
                    "name": "Politics", 
                    "short_name": "politics"
                }, 
                "shorturl": {
                    "short_url": "http://digg.com/news/politics/national_secular_society_norway_continues_the_long_process_of_disestablishing_the_lutheran_church", 
                    "view_count": 0
                }, 
                "promote_date": null, 
                "link": "http://www.secularism.org.uk/news/2012/03/norway-continues-the-long-process-of-disestablishing-the-lutheran-church", 
                "href": "http://digg.com/news/politics/national_secular_society_norway_continues_the_long_process_of_disestablishing_the_lutheran_church", 
                "id": "20120331150525:56935e86-2dbf-4831-ad60-50def7781e68"
            }, 
            "user": {
                "name": "ghelms", 
                "links": [], 
                "registered": 1158007588, 
                "profileviews": 0, 
                "fullname": "Gary Helms", 
                "icon": "http://cdn2.diggstatic.com/user/614412/l.2001177284.png"
            }, 
            "digg_id": "20120401011907:5cf92ee9-e915-4358-b14f-cf140b760469"
        }, 
    ], 
    "offset": 0
 }

我试图只获取一些元素“日期”、“描述”、“标题”、“diggs”、“链接”和“digg_id”。每当我尝试解析时,它在 listView 中不起作用,但如果我在 GetMethod 类中使用 String,它会将整个 API 解析为字符串并打印出来。

我的代码:

public DiggItemList lastDigg () throws Exception {
    ArrayList<HashMap<String,DiggItem>> diggsList = new  ArrayList<HashMap<String, DiggItem>>();
    JSONArray diggs = null;
    JSONObject json = null;
    Intent in = getIntent();
    String short_name = in.getStringExtra(TAG_SHORT_NAME);
    GetMethod get = new GetMethod();
    json = get.getInternetData();

    try {
        diggs = json.getJSONArray("diggs");

            dlists = new DiggItemList();
            for (int i = 0; i < diggs.length(); i++) {
                JSONObject c = diggs.getJSONObject(i);
                String date = c.getString("date");
                String description = c.getString("description");
                String title = c.getString("title");
                int digg = c.getInt("diggs");
                String link = c.getString("link");
                int digg_id = c.getInt("digg_id");

                //JSONObject topic = c.getJSONObject("topic");
                    //String sn = topic.getString("short_name");

                DiggItem di = new DiggItem();
                di.setDate(c.getInt("date"));
                di.setDescription(c.getString("description"));
                di.setTitle(c.getString("title"));
                di.setDiggs(c.getInt("diggs"));
                di.setLink(c.getString("link"));
                di.setDigg_id(c.getString("digg_id"));
                    dlists.add(di);
                    /*
                if (sn.equals(short_name)) {
                    dlists.add(di);
                }
                                */
            }

    }catch (JSONException e) {
        e.printStackTrace();
    }
    return dlists;
}

获取 API 的类。 (http://services.digg.com/2.0/digg.getAll)。

public class GetMethod {

    public JSONObject getInternetData() throws Exception {
        BufferedReader in = null;
        String data = "";
        JSONObject jObj = null;
        try {
            HttpClient client = new DefaultHttpClient();
            URI website = new URI("http://services.digg.com/2.0/digg.getAll");
            HttpGet request = new HttpGet();
            request.setURI(website);
            HttpResponse response = client.execute(request);
            in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            StringBuffer sb = new StringBuffer("");
            String line = "";

            while ((line = in.readLine()) != null) {
                    sb.append(line + "\n");
            }
            in.close();
            data = sb.toString();
        }finally {
            if (in != null) {
                try {
                    in.close();
                }catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        try {
            jObj = new JSONObject(data);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;
    }
    }

【问题讨论】:

    标签: android json digg


    【解决方案1】:

    只是建议一种简单的方法来完成所需的... 更多详情参考学习教程...https://stackoverflow.com/questions/5867544/android-json-parsing-tutorial/9742384#9742384

    public void parseData throws Exception {
    
                try {
        HttpClient httpclient = new DefaultHttpClient();
    
                    // Prepare a request object
            HttpGet httpget = new HttpGet("http://services.digg.com/2.0/digg.getAll");
    
                    // Execute the request
                    HttpResponse response;
                    // Get hold of the response entity
                        HttpEntity entity = response.getEntity();
                        // If the response does not enclose an entity, there is no need
                        // to worry about connection release
    
                        if (entity != null) {
    
                            // A Simple JSON Response Read
                            // InputStream instream = entity.getContent();
                            // String result = convertStreamToString(instream).trim();
    
                            String result = EntityUtils.toString(entity);
        JsonObject json = new JsonObject(result);
    
        JSONArray diggsJsonArray = json.getJSONArray("diggs");
    
        for(int i =0;i<diggsJsonArray.length;i++)
        {
        JsonObject individualDiggsObj = diggsJsonArray.getJSONObject(i);
    
          DiggItem di = new DiggItem();
                        di.setDate(individualDiggsObj.getInt("date"));
         di.setDiggId(individualDiggsObj.getString("digg_id"));
        JSONOnejct itesmJson = new JSONOBJECT(individualDiggsObjgetJSONObject("item");
    
        //NOw Fetch and Set the values of status,title,description,, etc from the itemsJson to your collection.
    
        //Similarly begin with other inner Array's and Object's if available.   
                    }catch(Exception e)
        {
        e.printStackTrace();
            }
    

    【讨论】:

      【解决方案2】:

      在您的代码日期中,当存储在“DiggItem di”中时,您使用的是整数值的 c.getInt("date") 字符串类型。 digg_id 也不能是 Integer,因为作为响应 digg_id 的值是字母数字的组合,因此您也可以在此处使用 String。

      【讨论】:

        【解决方案3】:

        首先创建一个 HTTP_HANDLER_CLASS...

        public class HttpHandler {
        
        private static final String TAG = HttpHandler.class.getSimpleName();
        
        public HttpHandler() {
        }
        
        public String makeServiceCall(String reqUrl) {
            String response = null;
            try {
                URL url = new URL(reqUrl);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                // read the response
                InputStream in = new BufferedInputStream(conn.getInputStream());
                response = convertStreamToString(in);
            } catch (MalformedURLException e) {
                Log.e(TAG, "MalformedURLException: " + e.getMessage());
            } catch (ProtocolException e) {
                Log.e(TAG, "ProtocolException: " + e.getMessage());
            } catch (IOException e) {
                Log.e(TAG, "IOException: " + e.getMessage());
            } catch (Exception e) {
                Log.e(TAG, "Exception: " + e.getMessage());
            }
            return response;
        }
        
        private String convertStreamToString(InputStream is) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            StringBuilder sb = new StringBuilder();
        
            String line;
            try {
                while ((line = reader.readLine()) != null) {
                    sb.append(line).append('\n');
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return sb.toString();
        }
        }
        

        然后创建一个私有类来获取数据

        private class GetContacts extends AsyncTask<Void, Void, Void> {
        
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                // Showing progress dialog
                pDialog = new ProgressDialog(Index.this);
                pDialog.setMessage("Please wait...");
                pDialog.setCancelable(false);
                pDialog.show();
        
            }
        
            @Override
            protected Void doInBackground(Void... arg0) {
                HttpHandler sh = new HttpHandler();
        
                // Making a request to url and getting response
                String jsonStr = sh.makeServiceCall(url);
        
                Log.e(TAG, "Response from url: " + jsonStr);
        
                if (jsonStr != null) {
                    try {
                        JSONObject jsonObj = new JSONObject(jsonStr);
        
                        // Getting JSON Array node
                        JSONArray contacts = jsonObj.getJSONArray("data");
        
                        // looping through All Contacts
                        for (int i = 0; i < contacts.length(); i++) {
                            JSONObject JO = (JSONObject) contacts.get(i);
                            /*if(JO.has("devices"))
                            {
                                Toast.makeText(Index.this,"No Data Found",Toast.LENGTH_LONG).show();
                            }*/
                            JSONObject jb = (JSONObject) JO.get("devices");
        
                            String id = jb.getString("user_id");
                            String trip_id = jb.getString("id");
                            String product = jb.getString("product");
                            String name = jb.getString("devices");
                            String start_geo = jb.getString("address");
                            String end_lat = jb.getString("Latitude");
                            String end_long = jb.getString("longitude");
                            //String gender = jb.getString("pointtopoint_estimate_id");
        
        
                            HashMap<String, String> contact = new HashMap<>();
        
                            // adding each child node to HashMap key => value
                            contact.put("id", id);
                            contact.put("trip_id", trip_id);
                            contact.put("product", product);
                            contact.put("name", name);
                            contact.put("start_geo", start_geo);
                            contact.put("end_lat",end_lat );
                            contact.put("end_long",end_long );
        
                            // adding contact to contact list
                            contactList.add(contact);
                        }
                    } catch (final JSONException e) {
                        Log.e(TAG, "Json parsing error: " + e.getMessage());
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(getApplicationContext(),
                                        "Your Internet Connection is Weak. Try Reloading Your Page",
                                        Toast.LENGTH_LONG)
                                        .show();
                            }
                        });
        
                    }
                } else {
                    Log.e(TAG, "Couldn't get json from server.");
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),
                                    "Check Your Internet Connection",
                                    Toast.LENGTH_LONG)
                                    .show();
                        }
                    });
        
                }
        
                return null;
            }
        
            @Override
            protected void onPostExecute(Void result) {
                super.onPostExecute(result);
                // Dismiss the progress dialog
                if (pDialog.isShowing())
                    pDialog.dismiss();
        }
        }
        

        【讨论】:

          猜你喜欢
          • 2012-11-27
          • 1970-01-01
          • 1970-01-01
          • 2019-04-03
          • 2020-10-07
          • 1970-01-01
          • 1970-01-01
          • 2013-04-19
          • 1970-01-01
          相关资源
          最近更新 更多