【问题标题】:Android - How to Represent JSON Information from URL through GSONAndroid - 如何通过 GSON 表示来自 URL 的 JSON 信息
【发布时间】:2018-09-13 03:09:58
【问题描述】:

我一直在尝试使用 URL 从在线 JSON 源中检索信息。我最初将信息解析为 Android 中的 TextView,但是我从 JSON 中获得了所有信息。下面是我所指的截图。

Text View Showing All Data In Json

基本上,我想要的只是显示位置,所以在上面的示例中,挪威奥斯陆在一个 Textview 中,然后在另一个显示该位置的当前月相,所以 - 再次使用上面的示例,打蜡新月。

这是我正在使用的 JSON。

{
  "version": 2,
  "locations": [{
    "id": "187",
    "geo": {
      "name": "Oslo",
      "country": {
        "id": "no",
        "name": "Norway"
      },
      "latitude": 59.913,
      "longitude": 10.740
    },
    "astronomy": {
      "objects": [{
        "name": "moon",
        "days": [{
          "date": "2018-09-13",
          "events": [],
          "moonphase": "waxingcrescent"
        }]
      }]
    }
  }]
}

为了将 JSON 解析为显示所有数据的 Textview,我使用了以下内容。

JSONObject jo = new JSONObject(data);
            JSONArray locations = jo.getJSONArray("locations");

            for (int i = 0; i < locations.length(); ++i) {
                JSONObject loc = locations.getJSONObject(0);
                JSONObject geo = loc.getJSONObject("geo");

                JSONObject country = geo.getJSONObject("country");

                JSONObject astronomy = loc.getJSONObject("astronomy");
                JSONObject objects = astronomy.getJSONArray("objects").getJSONObject(0);
                JSONObject day = objects.getJSONArray("days").getJSONObject(0);

                StringBuilder result = new StringBuilder();
                String singleParsed = "Moon: "+ astronomy.getString("moonphase");


            }



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


        return null;
    }

    @RequiresApi(api = Build.VERSION_CODES.CUPCAKE)
    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

        MainActivity.fetcheddata.setText(this.data);


    }

注意:在 For 循环中创建了一个字符串,称为“Single Parsed”,这就是我想要放在屏幕上的内容,但是 - 一旦我调用了该变量,屏幕上什么也没有显示。仅在使用时显示:

MainActivity.fetcheddata.setText(this.data);

但不是以下情况,我实际上收到一条错误消息“无法解析符号,singleParsed 也是如此。

MainActivity.fetcheddata.setText(this.singleParsed);

在对 Stack 进行了一些研究和之前的问题之后,我相信 GSON 是做我想做的事情的方法,但是我不知道从哪里开始,或者如何使用 GSON 完成任务。

感谢所有帮助。

【问题讨论】:

  • 如果您先阅读 Gson 用户指南,然后尝试示例,这将有所帮助... 完成后,请随时 edit 提出您的问题
  • 其次,MainActivity.fetcheddata 是错误的。永远不要让 View 成为静态变量。无论您使用什么网络库,都需要更新 UI 本身。

标签: android json gson


【解决方案1】:

通过 GSON 来自 URL 的 JSON 信息

简单的答案 - Look at using Retrofit, and find a tutorial on it,以及as Gson


然而

您不需要 Gson 来解决您的问题,我建议您解决手头的问题,而不是走上不必要的道路。

首先,singleParsed 是循环中的一个本地变量。因此,this.singleParsed 不存在。或者如果是这样,你永远不会设置它。

其次,假设您只有一个位置,因此您不需要循环。与您访问其他 JSON 数组的方式类似,只需获取第一个数组项。

最后,您需要了解 AsyncTask 的工作原理,但我一般推荐的解决方案是How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?

但是,为了这个目的,这里有一个简单的例子,AsyncTask&lt;String, Void, String&gt;

// protected String doInBackground(String... url) { // I assume you have this ??

    // String data = parseJsonFrom(url[0]);

    String singleParsed = "(none)";

    try {
        JSONObject jo = new JSONObject(data);
        JSONObject firstLocationAstronomy = jo
          .getJSONArray("locations").getJSONObject(0)
          .getJSONObject("astronomy");
        JSONObject firstDay = firstLocationAstronomy
          .getJSONArray("objects").getJSONObject(0)
          .getJSONArray("days").getJSONObject(0);
        singleParsed = firstDay.getString("moonphase");
    } catch (Exception e) { // TODO: catch a JSONParseException 
    }

    return singleParsed; // This is returned to onPostExecute, don't store a variable elsewhere

}

然后在 MainActivity 中,无论您在哪里执行此任务,并设置文本

new MoonPhaseTask() {
    @Override
    protected void onPostExecute(String moonPhase) {
        MainActivity.this.textView.setText("Phase: " + moonPhase);
    }
}.execute("some url");

我想要的只是显示位置,所以在上面的示例中,挪威奥斯陆在一个 Textview 中,然后在另一个显示该位置的当前月相

您可以更改 AsyncTask 以将整个 JSONObject 返回到onPostExecute,并在您真正需要时解析JSON。只是网络部分需要脱离 UI 线程......解析的计算成本并不高。

【讨论】:

  • 您能告诉我为什么我在“.getJSONObject("geo")”上收到“无法解析方法“getJSONObject(java.lang.String)”吗?非常感谢。
  • 可能是因为我打错了一些东西,而这段代码并不是完全按原样复制粘贴的
  • 当然,不应该直接粘贴代码。我尝试将其键入并调试,但到目前为止没有运气。还是谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 2017-07-05
  • 2023-03-06
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多