我想使用 http 从服务器获取 JSONObject

i want to get JSONObject from server using http

我对一些已弃用的方法有疑问。(httpDefault)

我想要的很简单:我有 url (json 数据) -> 发送请求 -> 接收 jsonObject.

我不知道。我已经尝试了一些教程,但它对我不起作用。 ( 1. http://techlovejump.com/android-json-parser-from-url/ 2. https://www.youtube.com/watch?v=Fmo3gDMtp8s&list=PLsoBxH455yoZZeeza9TiG8I9dGP0zz5o9&index=4)

这是我的示例代码。只处理字符串数据。 (不是来自服务器数据。)

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

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {

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

       /* // url : http://www.jsoneditoronline.org/?id=a31f7f816285e14991e175fccd09a561
        * {
        *   "id":123,
        *   "name":abc,
        *   "status":"ok"
        * }
        */
        final String customJSON = "{\"id\":123,\"name\":abc,\"status\":\"ok\"}";

        try {
            JSONObject jsonObject = new JSONObject(customJSON);
            int id = jsonObject.getInt("id");
            String name = jsonObject.getString("name");
            String status = jsonObject.getString("status");
            Toast.makeText(MainActivity.this, "id #"+id+", name #"+name+", status #"+status, Toast.LENGTH_SHORT).show();

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

请给我你的提示。

我如何获得 JSONObject(我只有 url)。 url : http://www.jsoneditoronline.org/?id=a31f7f816285e14991e175fccd09a561

执行此操作的正确方法是将请求包装在 worker thread 中。其中一种方法是使用 AsyncTask。请参阅 http://developer.android.com/reference/android/os/AsyncTask.html 以了解 android 记录的用法,但它基本上归结为以下实现:

扩展 AsyncTask 的私有子类,它实现了以下方法:

  1. onPreExecute – 在任务执行之前在 UI 线程上调用,用于设置内容(例如显示进度条)

  2. doInBackground – 您要执行的实际操作,在 onPreExecute

  3. 之后立即触发
  4. onPostExecute – 在 doInBackground 完成后在 UI 线程上调用。这将 doInBackground 的结果作为参数,然后可以在 UI 线程上使用。

AsyncTask 用于 UI 线程不允许的操作,例如:

  • 打开套接字连接
  • HTTP 请求(例如 HTTPClient 和 HTTPURLConnection)
  • 正在尝试连接到远程 MySQL 数据库
  • 正在下载文件\你的JSON

您当前的代码位于将在 UI 线程上创建的方法中(这将抛出 NetworkOnMainThreadException,因此您需要将代码移至 UI 线程=61=] 在主线程上,例如 AsyncTask、Handler 或类似的东西。我在 AndroidHive 上发现 JSON Parsing 教程对学习很有帮助,并参考 Android文档。

正如 smittey 所提到的,您需要使用后台线程或使用 AsyncTask 来执行该请求。要执行 http 请求,您可以使用库 OkHttp and here is an exampele。请记住在您的清单中使用 <uses-permission android:name="android.permission.INTERNET" /> 来访问互联网。

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

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {

    Context context;

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


         new AsyncTask<String, Integer, String>() {
            @Override
            protected String doInBackground(String... params) {

                StringBuilder responseString = new StringBuilder();
                try {
                    HttpURLConnection urlConnection = (HttpURLConnection) new URL("http://you_url_here").openConnection();
                    urlConnection.setRequestMethod("GET");
                    int responseCode = urlConnection.getResponseCode();
                    if (responseCode == 200){
                        BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                        String line;
                        while ((line = reader.readLine()) != null) {
                            responseString.append(line);
                        }
                    }
                    urlConnection.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return responseString.toString();
            }

            @Override
            protected void onPostExecute(String o) {
                Toast toast = Toast.makeText(context, (CharSequence) o, Toast.LENGTH_SHORT);
                toast.show();

                /* if your json structure this type then it will work now 
                * {
                *   "id":123,
                *   "name":abc,
                *   "status":"ok"
                * }
                */
                try {
                    JSONObject jsonObject = new JSONObject(o);
                    int id = jsonObject.getInt("id");
                    String name = jsonObject.getString("name");
                    String status = jsonObject.getString("status");
                    Toast.makeText(MainActivity.this, "id #"+id+", name #"+name+", status #"+status, Toast.LENGTH_SHORT).show();

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


            }
        }.execute("");
    }
}

你可以试试这个。它对我有用,我希望它也对你有用。