解析天气应用程序的JSON数据

时间:2016-09-11 19:02:50

标签: android json

我正在尝试显示从开放天气图中获得的天气数据。数据似乎位于json变量中,但我无法正确解析。

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

这是来自开放天气的数据,带有正确的api密钥。我试图解析城市,温度,压力和湿度。

这是天气片段

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);
    }
}

这是fetch java类

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;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您需要从JSON响应中删除HTML,然后只有您能够检索JSONArray,然后您可以解析它以获取数据。如下所示:

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

来源:How to strip HTML tags

然后按如下方式从JSONArray中检索数据

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
}

答案 1 :(得分:0)

代码示例不是JSON,而是XML。但是,如果要解析JSON字符串,建议使用GenSON。库的存储库为https://github.com/EvgeniGenchev/GenSON-lib。在内部,您可以找到用于从OpenWeather API进行解析的示例Java代码。