SaluteWarmTinct
2015-06-25 08:48
采纳率: 86%
浏览 3.0k

关于Android获取JSON数据的问题,直接上代码了

打开URL后的数据:图片说明
写的测试类:

 package com.zb.json_text;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {
    private List<Map<String, String>> slist= new ArrayList<Map<String, String>>(); 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String path="http://m.lalas.cn/help/all_1.html?format=json&size=5";

        try {
            slist=getJSONObject(path);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
            System.out.println("----------------------------listchangdu-------------------------------"+slist.size());
    }


    public static List<Map<String, String>> getJSONObject(String path) throws Exception {

        System.out.println("---------------------------------------进来了-------------------------------------");
        List<Map<String, String>> list = new ArrayList<Map<String, String>>();
         Map<String, String> map =null;
         URL url=new URL(path);
         //利用HttpURLConnection对象,我们可以从网页中获取网页数据
         HttpURLConnection conn=(HttpURLConnection) url.openConnection();
         //单位为毫秒,设置超时时间为5秒
         conn.setConnectTimeout(15*1000);
         //HttpURLConnection对象是通过HTTP协议请求path路径的,所以需要设置请求方式,可以不设置,因为默认为get
         conn.setRequestMethod("GET");
         System.out.println("-------------------------conn.getResponseCode"+conn.getResponseCode());
         if(conn.getResponseCode()==200){//判断请求码是否200,否则为失败
             InputStream is=conn.getInputStream();  //获取输入流
             byte[] data =readStream(is);       //把输入流转换成字符串组
             String json=new String(data);      //把字符串组转换成字符串


            //数据形式:{"total":2,"success":true,"arrayData":[{"id":1,"name":"小猪"},{"id":2,"name":"小猫"}]} 

             JSONObject jsonObject=new JSONObject(json);    //返回的数据形式是一个Object类型,所以可以直接转换成一个Object 
             int total=jsonObject.getInt("count");
             String keywords=jsonObject.getString("keywords");

             System.out.println("=========================================================================");
             System.out.println("!!!!!!!!!!!!!!--------------"+total+"--------"+keywords);

            //里面有一个数组数据,可以用getJSONArray获取数组  
             JSONArray jsonArray=jsonObject.getJSONArray("data");
             for(int i =1;i<jsonArray.length();i++){
                 JSONObject item=jsonArray.getJSONObject(i);    //得到没个对象
                 int id =item.getInt("id");
                 String title=item.getString("title");
                 String description=item.getString("description");
                 int time =item.getInt("time");

                 map=new HashMap<String,String>();
                 map.put("id", id+"");
                 map.put("title", title);
                 map.put("description", description);
                 map.put("time", time+"");
                 list.add(map);
             }

             for (Map<String, String> list2 : list) {     
                    String id = list2.get("id");     
                    String name = list2.get("description");     
                    Log.i("abc", "id:" + id + " | name:" + name);     
                }    
         }

         return list;
    }




    private static byte[] readStream(InputStream inputStream) throws Exception {
         ByteArrayOutputStream bout = new ByteArrayOutputStream();     
            byte[] buffer = new byte[1024];     
            int len = 0;     
            while ((len = inputStream.read(buffer)) != -1) {     
                bout.write(buffer, 0, len);     
            }     
            bout.close();     
            inputStream.close();     

            return bout.toByteArray(); 
    }
}

AndroidManifest.xml里也加了权限:

但是运行后是没有拿到任何数据的。调试在走到获取请求码(conn.getResponseCode())的时候就断了。为什么这里会报错呢?

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • 大树底下的苹果 2015-06-25 15:48
    已采纳

    你好像是在UI主线程里面获取网络数据吧,安卓4.0以后貌似不能这样,你可以试试看在AndroidManifest.xml文件中把android:targetSdkVersion=“”删除掉试试看。不过这个方法就算可以也不是治本的方法,
    你可以尝试用AsyncTask来获取网络数据试试看

    打赏 评论
  • Soulic 2015-06-25 09:15

    看看logcat的信息,可以从logcat信息中看出一些东西来,比如有没有异常发生之类的

    打赏 评论
  • SaluteWarmTinct 2015-06-25 09:27

    就是没有报什么异常,我才毫无头绪嘛

    打赏 评论
  • 小小懒羊羊 2015-06-25 11:50

    代码应该没有问题。。。

    打赏 评论
  • all987 2015-06-26 01:45

    我之前用爱内测做过跟踪,你可以试试看

    打赏 评论
  • 月盡天明 2015-06-28 06:03

    不要在主线程中做网络操作。。。

    打赏 评论
  • 隐藏的萤火虫 2015-07-02 11:16

    请求网络数据,线程都不开????

    打赏 评论

相关推荐 更多相似问题