简体   繁体   中英

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:

RemoteFetch.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:

 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. The renderWeather method uses the JSON data to update the TextView objects that I set up in my fragment class:

 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.

So far, with the weather setup, everything works fine, the only problem is with the renderWeather method. I'm trying to use JSON to display the weather data in the following TextViews currently:

 *`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

This is what the JSON response looks like (formatted for readability):

{
   "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. The JSON Format is going to be simple, :-

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]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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