无法使用JSON获取解析数据

时间:2016-02-15 20:33:20

标签: android json

我正在学习使用JSON解析URL中的数据。 在下面的代码中,我是URLConnection类对象,用于从URL获取数据。

代码不显示任何错误,但在执行时会产生空白屏幕。 我无法理解为什么会这样。

这是代码。

package com.example.asad.parse;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;

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

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class MainActivity extends AppCompatActivity {
    TextView tv;
    int count=0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("asd", "calling call");

        new GetJson().execute("http://api.androidhive.info/json/movies.json");
//        try{
//
//                call();
//            }catch(Exception e) {
//
//        }

    }
    public class GetJson extends AsyncTask<String, Void, Void>
    {
        @Override
        protected Void doInBackground(String... params) {
            Log.d("asd", params[0]);
//            Log.d("asd","outside try");
            StringBuffer sb=new StringBuffer();
            URL url= null;
            try {
                Log.d("asd","inside call");
                url = new URL(params[0]);

                URLConnection tc = url.openConnection();
                BufferedReader br = new BufferedReader(new InputStreamReader(
                        tc.getInputStream()));

                Log.d("asd","above while.");
                String line;
                while ((line = br.readLine()) != null) {

                    Log.d("asd","inside while.");
                    JSONArray ja = new JSONArray(line);
                    for (int i = 0; i < ja.length(); i++) {
                        JSONObject jo = (JSONObject) ja.get(i);
                      Log.d("asd",jo.toString());
                    }
                }
//
//            tv=(TextView)findViewById(R.id.textView);
//            tv.setText(sb);
                Log.d("asd",sb.toString());

            } catch (Exception e) {
                e.printStackTrace();
                Log.d("asd", "I am in catch");

            }
            return null;
        }
    }
}

4 个答案:

答案 0 :(得分:1)

建议JSON使用StringBuilder。 你的代码可能有些问题:

  1. mainfest.xml中的权限

    <uses-permission android:name="android.permission.INTERNET"/>
    
  2. 逐行阅读并不是JSON的完美解决方案。
  3. 使用静态方法从URL

    返回完整的json文本
    public static String getData(String uri) {
        BufferedReader reader = null;
        try {
            URL url = new URL(uri);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
    
            StringBuilder sb = new StringBuilder();
            reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String line;
    
            while ((line = reader.readLine()) != null) {
                sb.append((line + "\n"));
            }
    
            return sb.toString();
    
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return null;
    
        } catch (IOException e) {
            e.printStackTrace();
            return null;
    
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    return null;
                }
            }
        }
    }
    

    之后,您可以通过寻址正确的数组/对象来遍历您的json文本。 在AsyncTask中:

    String jsonText = getData("http://api.androidhive.info/json/movies.json");
    try {
            JSONArray jsonArray = new JSONArray(jsonText);
            ...
    }
    

    之后开始阅读json对象

答案 1 :(得分:0)

在获得回复后更新视图,获得textview和setText。

答案 2 :(得分:0)

根据JAVA DOC

,一切看起来都不错

尝试检查您的清单文件internet权限:

<uses-permission android:name="android.permission.INTERNET"/>

答案 3 :(得分:0)

你在catch条款中加入了一条日志声明但是你不看它写的是什么...... 首先使用StringBuffer和BufferedReader构建整个字符串,然后将其转换为json数组或对象。

URLConnection tc = url.openConnection();
        BufferedReader br = new BufferedReader(new InputStreamReader(tc.getInputStream()));

        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }

        JSONArray ja = new JSONArray(sb.toString());
        for (int i = 0; i < ja.length(); i++) {
            JSONObject jo = (JSONObject) ja.get(i);
            Log.d("asd", jo.toString());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }