[英]How to use JSON to display weather data?
基本上,我为天气应用程序设计了 UI/UX,为它设置了一个远程连接类以从 OpenWeatherMap API 获取数据:
远程获取.java:
import android.content.Context;
import androidx.appcompat.app.AppCompatActivity;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class RemoteFetch extends AppCompatActivity {
private static final String OPEN_WEATHER_MAP_API =
"https://api.openweathermap.org/data/2.5/onecall?lat=9.0765&lon=7.3986&exclude=daily&appid=";
public static JSONObject getJSON(Context context, String city){
try {
URL url = new URL(String.format(OPEN_WEATHER_MAP_API, city));
HttpURLConnection connection =
(HttpURLConnection)url.openConnection();
connection.addRequestProperty("x-api-key",
context.getString(R.string.open_weather_maps_app_id));
BufferedReader reader = new BufferedReader(
new InputStreamReader(connection.getInputStream()));
StringBuilder json = new StringBuilder(1024);
String tmp;
while((tmp=reader.readLine())!=null)
json.append(tmp).append("\n");
reader.close();
JSONObject data = new JSONObject(json.toString());
// This value will be 404 if the request was not
// successful
if(data.getInt("cod") != 200){
return null;
}
return data;
}catch(Exception e){
return null;
}
}
}
创建了一个thread
来为片段类中的 RemoteFetch 类调用getJSON
,如果getJSON
返回的值为 null,则应向用户显示错误消息:
private void updateWeatherData(final String city) {
new Thread(){
public void run(){
final JSONObject json = RemoteFetch.getJSON(getActivity(), city);
if(json == null){
handler.post(new Runnable(){
public void run(){
Toast.makeText(getActivity(),
getActivity().getString(R.string.place_not_found),
Toast.LENGTH_LONG).show();
}
});
} else {
handler.post(new Runnable(){
public void run(){
renderWeather(json);
}
如果不是,则应调用renderWeather
方法。 renderWeather
方法使用 JSON 数据更新我在片段类中设置的TextView
对象:
private void renderWeather(JSONObject json){
try {
cityField.setText(json.getString("name").toUpperCase(Locale.US)) +
", " +
json.getJSONObject("sys").getString("country");
JSONObject details = json.getJSONArray("Weather").getJSONObject(0);
JSONObject main = json.getJSONObject("main");
detailsfield.setText(
details.getString("description").toUpperCase(Locale.US) +
"\n" + "Humidity: " + main.getString("humidity") + "%" +
"\n" + "Pressure: " + main.getString("pressure") + " hpa");
current_temp.setText(
String.format("%.2f", main.getDouble("temp")) + " \\u2103");
DateFormat df = DateFormat.getDateTimeInstance();
String updatedOn = df.format(new Date(json.getLong("dt") * 1000));
updatedField.setText("Last update: " + updatedOn);
setcurrent_output(details.getInt("id"),
json.getJSONObject("sys").getLong("sunrise") * 1000,
json.getJSONObject("sys").getLong("sunset") * 1000);
}catch (Exception e){
Log.e("lightweatherforcast", "One or more fields not found in this JSON data");
}
}
});
}
}
}.start();
}
现在这就是问题所在,因为我从中学到的教程使用它来匹配他们的应用程序 UI,但我的应用程序是不同的,并且包含我需要从设置中添加的更多详细信息,我已经尝试了很多方法来匹配我的应用程序 UI不成功。
到目前为止,使用天气设置,一切正常,唯一的问题是renderWeather
方法。 我目前正在尝试使用JSON
在以下TextViews
显示天气数据:
*`User city(cityField)`,
*`Current time(Updated Field)`
*`Current Temperature(current_temp)`
*`Condition of the current temperature(current_output)`
*`Tomorrow Temperature(small_temp1)`
*`Condition of tomorrow's temperature(small_icon1)`
*`Next tomorrow's temperature(small_temp2)`
*`Condition of Next tomorrow's temperature(small_icon2)`
*`Sunrise time(rise_time)`
*`Sunset set(set_time)`
在天气条件面板下:
*`Temperature(temp_out)`
*`Pressure(press_out)`
*`Humidity(Humid_out)`
*`Wind Speed(Ws_out)`
*`Visibility(Visi_out)`
*`UV index(UV_out)`
进程以退出代码 0 结束
这是 JSON 响应的样子(为了可读性而格式化):
{
"lat":9.08,
"lon":7.4,
"timezone":"Africa/Lagos",
"timezone_offset":3600,
"current":{
"dt":1608984165,
"sunrise":1608961391,
"sunset":1609003132,
"temp":305.15,
"feels_like":303.24,
"pressure":1012,
"humidity":25,
"dew_point":282.68,
"uvi":8.87,
"clouds":35,
"visibility":5000,
"wind_speed":2.6,
"wind_deg":150,
"weather":[
{
"id":721,
"main":"Haze",
"description":"haze",
"icon":"50d"
}
]
}
}
这似乎是重复的,我留下了您可能会在下面发现有用的链接的链接。
但是,作为在上面的问题中回答的以文本形式实际表示这些天气数据的简单答案,您可以选择设置要将其放置在您想要的 UI 中的位置。 JSON 格式将很简单,:-
city: {
id: 2643743, //City ID, You may find more about these at https://openweathermap.org/find?q=
name: "London", //City Name, Just the name of your city
coord: {
lon: -0.12574,//These are coordinates for the city, Find them at google maps
lat: 51.50853
},
country: "GB", //Country names, GB here stands for United Kingdom, learn more at https://sustainablesources.com/resources/country-abbreviations/
population: 0 //Country Population
},
cod: "200",
message: 0.0268,
cnt: 5,
list: [
{
dt: 1448535600,
temp: { //Average Temperature at these times of the day (Current data is for london)
day: 8.58,
min: 8.58,
max: 9.18,
night: 9.18,
eve: 8.58,
morn: 8.58
}, //This is average temperature properties
pressure: 1025.14,
humidity: 95,
weather: [
{//Average Rain (Properties & Probabilities)
id: 500,
main: "Rain",
description: "light rain",
icon: "10d"
}
],
speed: 3.67,
deg: 224,
clouds: 92,
rain: 0.35
},
{},
{},
{},
{}
]
您可以使用以下方法访问这些数据:-
JSONObject forecastJson = new JSONObject(jsonString);
JSONArray forecastArray = forecastJson.getJSONArray("list");
double minTemp, maxTemp;
for(int i = 0; i < forecastArray.length(); i++) {
JSONObject dailyForecast = forecastArray.getJSONObject(i);
JSONObject tempObject = dailyForecast.getJSONObject("temp");
minTemp = tempObject.getDouble("min");
maxTemp = tempObject.getDouble("max");
//add these minTemp and maxTemp to array or the
//way you want to use
}
如果您发现我的回答很奇怪、难以理解或难以理解,您可以查看我在下面嵌入的问题。 谢谢。 [1]: 如何在json中检索天气数据[android]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.