我一直在尝试使用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完成任务。
感谢所有帮助。
答案 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线程...解析在计算上并不昂贵。