【问题标题】:Parsing extremely simple JSON from a URL in in Android从 Android 中的 URL 解析极其简单的 JSON
【发布时间】:2018-07-19 18:43:14
【问题描述】:

我已经在网上尝试了所有方法来尝试解析这个 JSON,但似乎没有任何效果。这是 JSON:

{"salonphoebe":true,"salonvo":false}

就是这样。它只是布尔值。如果这很重要,它来自 HTTP 网站。 如何在 Android Studio 的 Java 中解析来自 http://example.com 的这个极其简单的 JSON?我正在尝试在我的应用程序中基于这些创建布尔值。我知道这个问题在这个网站上很多,但我确实尝试了 10 种解决方案,但没有任何效果。谢谢。

【问题讨论】:

  • 你能把代码贴出来
  • 我没有代码。我不知道从哪里开始。我只有一个基本的 MainActivity.java

标签: java android json parsing


【解决方案1】:

试试下面的代码。

try {
  JSONObject json = new JSONObject(your - json - string - here);
  boolean b1 = json.optBoolean("salonphoebe");
  boolean b2 = json.optBoolean("salonvo");
 } catch (JSONException e) {
  e.printStackTrace();
 }

【讨论】:

  • 如何从网上获取 JSON 字符串?
  • 当我将 JSON 粘贴到“your-json-string-here”中时,该代码非常适合解析 JSON
  • 那么剩下的唯一问题是如何从网上获取 JSON 字符串?
  • @emmetMiller 查找 Retrofit,这是 Android 的标准网络库。您也不需要上面的代码,您可以让 GSON 或任何其他反序列化库为您处理。有大量的教程。
【解决方案2】:

好的,我已经解决了我自己的问题。这是我学到的一切以及我所做的一切。如果他们遇到这个问题,我想帮助其他人解决这个问题。首先,我将此添加到我的 androidmanifest.xml:

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

然后我在 androidmanifest.xml 的标签之间添加了这个,因为我从中解析 JSON 的链接是一个 HTTP 链接:

android:usesCleartextTraffic="true"

真正快速地将所有这些导入到您的 mainactiviy.java 中:

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

然后我们开始讨论困难的事情。解析来自 Internet 的 JSON 数据有两个部分。首先,您必须从 URL 中读取 JSON(将在线的 JSON 转换为字符串),然后您必须将 JSON 的字符串组织成单独的变量。因此,让我们从 HTTP 请求开始。我在我在网上找到的 MainActivity.java(在 OnCreate 下)中创建了一个 Async 类,如下所示:

public class HttpGetRequest extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        try {
            String url = "http://example.com/example.php";
            URL obj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
            int responseCode = con.getResponseCode();
            System.out.println("\nSending 'GET' request to URL : " + url);
            System.out.println("Response Code : " + responseCode);
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(con.getInputStream()));
            String inputLine;
            System.out.println("Test");
            StringBuffer response = new StringBuffer();
            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }

            in.close();

            String jsonResponse = response.toString();
            return  jsonResponse;

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        try {
            JSONObject json = new JSONObject(result);
            boolean myJsonBool = json.optBoolean("samplestringinyourjson");
            if(hasPaid){
                //do something 
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

}
}

好的,所以基本上我们将它放在 Async 类中的原因是因为 java 不允许您在 OnCreate 中发出 HTTP 请求。 doInBackground 正在做的是获取 JSON 数据并将其放入字符串中,就像我说的那样。 OnPostExecute 将该字符串分离为布尔值并对其进行处理。最后,将其粘贴到您的 OnCreate 中,否则将无法正常工作:

new HttpGetRequest().execute();

就是这样。如果您有任何问题,希望我能看到。

【讨论】:

  • 您好 Emmett:很高兴您自己找到了解决方案。下一步尝试使用 Volley 和 Retrofit 等库来下载内容。这比使用基础要容易得多:)
猜你喜欢
  • 2012-10-29
  • 2012-10-23
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多