2

I am trying to display weather data that I get from open weather map. The data seems to be sitting in the json variable however I can not parse that correctly.

<current>
<city id="4459467" name="Cary">
<coord lon="-78.78" lat="35.79"/>
<country>US</country>
<sun rise="2016-09-11T10:55:38" set="2016-09-11T23:26:18"/>
</city>
<temperature value="304.23" min="302.15" max="305.37" unit="kelvin"/>    
<humidity value="45" unit="%"/>
<pressure value="1018" unit="hPa"/>
<wind>
<speed value="2.6" name="Light breeze"/>
<gusts/><direction value="0" code="N" name="North"/>
</wind>
<clouds value="75" name="broken clouds"/>
<visibility/>
<precipitation mode="no"/>
<weather number="803" value="broken clouds" icon="04d"/>
<lastupdate value="2016-09-11T18:08:01"/></current>

This is the data from open weather with correct api key. I am trying to parse just the city, temperature, pressure and humidity.

Here is the weather fragment

public class Weather_fragment extends Fragment {

    TextView cityField;
    TextView detailsField;
    TextView currentTemperatureField;

    Handler handler;

    public Weather_fragment(){
        handler = new Handler();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.weather_fragment, container, false);

        cityField = (TextView)rootView.findViewById(R.id.city_field);
        detailsField = (TextView)rootView.findViewById(R.id.details_field);
        currentTemperatureField = (TextView)rootView.findViewById(R.id.current_temperature_field);

        return rootView;
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        updateWeatherData(new CityPreference(getActivity()).getCity());
    }

    private void updateWeatherData(final String city){
        new Thread(){
            public void run(){
                final JSONObject json = Fetch.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);
                        }
                    });
                }
            }
        }.start();
    }

    private void renderWeather(JSONObject json){
        try {

           cityField.setText(json.getString("name").toUpperCase(Locale.US));

            JSONObject main = json.getJSONObject("main");
            detailsField.setText("Humidity: " + main.getString("humidity") + "%" +
                "\n" + "Pressure: " + main.getString("pressure") + " hPa");

            currentTemperatureField.setText(String.format("%.2f", main.getDouble("temp"))+ " ℃");

        }catch(Exception e){
            Log.e("SimpleWeather", "error");
        }
    }


    public void changeCity(String city){
        updateWeatherData(city);
    }
}

This is the fetch java class

public class Fetch {

    private static final String OPEN_WEATHER_MAP_API =
        "http://api.openweathermap.org/data/2.5/weather?q=";

    public static JSONObject getJSON(Context context, String city){
        try {

            String City = "Sydney, AU";
            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()));

            StringBuffer Weatherdata = new StringBuffer();
            String storage = "";
            while((storage=reader.readLine())!=null) {
                Weatherdata.append(storage  + "\n");
            }

            JSONObject data = new JSONObject(Weatherdata.toString());
            return data;
        } catch(Exception e) {
            return null;
        }
    }
}
OneCricketeer
  • 179,855
  • 19
  • 132
  • 245

2 Answers2

0

You need to strip the HTML from the JSON response and then only you will be able to retrieve the JSONArray which you can then parse to get your data. Like below :

public String stripHtmlResponse (String html) {
    return Html.fromHtml(html).toString();
}

Source : How to strip HTML tags

Then retrive the data from JSONArray as follows

HttpEntity entity = response.getEntity();
String data = EntityUtils.toString(entity); 
String noHTML = stripHtml(data);

JSONArray jsonArray = new JSONArray(noHTML);

for(int i = 0; i < jsonArray.length(); i++) {

    // Do parsing of your JSONArray for required data
}
Community
  • 1
  • 1
Gaurav Sarma
  • 2,248
  • 2
  • 24
  • 45
  • so after completing the fetch activity the JSON Object json that I am sending to renderweather needs to be striped of the html.There for I would put this code apart of renderweather is that correct? – Geoffrey Knupp Sep 11 '16 at 19:21
  • You can put the stripHtmlResponse function anywhere in the class. And use the retrive JSONArray code where ever you receive the response object. – Gaurav Sarma Sep 11 '16 at 19:25
  • I am a little lost on this part of the code. HttpEntity entity = response.getEntity(); String data = EntityUtils.toString(entity); String noHTML = stripHtml(data); This shows up as undefined variables I sent the JSONObject json to the striphtmlresponse it still exceptions out at the current moment. – Geoffrey Knupp Sep 11 '16 at 19:54
  • Not sure this answers the question... The data shown isn't even JSON – OneCricketeer Sep 11 '16 at 20:35
  • you answered my question and I realized I wasted 3 hours trying to read something that was not even json..... – Geoffrey Knupp Sep 11 '16 at 20:52
0

The code example is not JSON but XML. However, if you want to parse a JSON String i suggest using GenSON. The repo for the library is https://github.com/EvgeniGenchev/GenSON-lib . Inside you can find example java code for parsing from OpenWeather API's.