简体   繁体   English

如何使用 JSON 显示天气数据?

[英]How to use JSON to display weather data?

Basically, I have designed UI/UX for a weather app, set up a remote connection class for it for fetching data from OpenWeatherMap API:基本上,我为天气应用程序设计了 UI/UX,为它设置了一个远程连接类以从 OpenWeatherMap API 获取数据:

RemoteFetch.java:远程获取.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;
         }
     }
 }

created a thread to call getJSON for the RemoteFetch class inside my fragment class and If the value returned by getJSON is null, should display an error message to the user:创建了一个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);
                     }

If it isn't, should invoke the renderWeather method.如果不是,则应调用renderWeather方法。 The renderWeather method uses the JSON data to update the TextView objects that I set up in my fragment class: 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();
 }

Now this is where the problem is because the tutorial I learned from used it to match their app UI but my app is different and contains more details which I need to add from my setup, I have tried so many methods unfailingly to match my APP UI unsuccessfully.现在这就是问题所在,因为我从中学到的教程使用它来匹配他们的应用程序 UI,但我的应用程序是不同的,并且包含我需要从设置中添加的更多详细信息,我已经尝试了很多方法来匹配我的应用程序 UI不成功。

So far, with the weather setup, everything works fine, the only problem is with the renderWeather method.到目前为止,使用天气设置,一切正常,唯一的问题是renderWeather方法。 I'm trying to use JSON to display the weather data in the following TextViews currently:我目前正在尝试使用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)`

Under weather conditions panel:在天气条件面板下:

 *`Temperature(temp_out)`
 *`Pressure(press_out)`
 *`Humidity(Humid_out)`
 *`Wind Speed(Ws_out)`
 *`Visibility(Visi_out)`
 *`UV index(UV_out)`

Process finished with exit code 0进程以退出代码 0 结束

This is what the JSON response looks like (formatted for readability):这是 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"
         }
      ]
   }
}

This seems to be a duplicate I left the link of the link that you might find useful below.这似乎是重复的,我留下了您可能会在下面发现有用的链接的链接。

But as a simple answer to actually represent these weather data in text as answered in that question above, then you the options to set where you want to place it in what UI you want.但是,作为在上面的问题中回答的以文本形式实际表示这些天气数据的简单答案,您可以选择设置要将其放置在您想要的 UI 中的位置。 The JSON Format is going to be simple, :- 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
},
{},
{},
{},
{}
]

you can access these data using :-您可以使用以下方法访问这些数据:-

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
}

If you find my answer weird, hard to understand or difficult, you can check the question that i embed below.如果您发现我的回答很奇怪、难以理解或难以理解,您可以查看我在下面嵌入的问题。 Thanks.谢谢。 [1]: How to retrieve weather data in json [android] [1]: 如何在json中检索天气数据[android]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM