Android-如何通过GSON表示URL中的JSON信息

时间:2018-09-13 03:09:58

标签: android json gson

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

Text View Showing All Data In Json

本质上,我想要的只是显示位置,因此在上面的示例中,奥斯陆在挪威的一个文本视图中,然后在另一个示例中显示了该位置的当前月相,因此-再次使用上面的示例,打蜡新月。

这是我正在使用的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完成任务。

感谢所有帮助。

1 个答案:

答案 0 :(得分:0)

  

来自通过GSON的URL的JSON信息

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


但是

您不需要Gson来解决您的问题,我建议您立即解决问题,而不要走不必要的路。

首先,singleParsed是循环中的 local 变量。因此,this.singleParsed不存在。否则,您永远都不会设置它。

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

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

但是,为此,这里是一个AsyncTask<String, Void, String>

的简单示例
// 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");
  

我想要的只是显示位置,因此在上面的示例中,奥斯陆在挪威的一个文本视图中,然后在另一个示例中显示了该位置的当前月相

您可以更改 AsyncTask,将整个 JSONObject返回给onPostExecute,并在需要时解析JSON。只是网络部分需要脱离UI线程...解析在计算上并不昂贵。