2016-09-11 48 views
1

我试图显示从天气图中获得的天气数据。数据似乎坐在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); 
    } 
} 

这是获取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; 
     } 
    } 
} 
+0

我建议你看一看[ANDROID,解析JSON从Web服务器和显示数据在ListView](http://stackoverflow.com/a/36243380/2311047) –

+0

数据不是JSON它是在xml –

+0

但您的代码调用JSON对象 –

回答

0

您需要从JSON响应剥去HTML,然后只有你就能检索JSONArray然后您可以解析以获取数据。如下图所示:

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

来源:How to strip HTML tags

然后从JSONArray retrive数据如下

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 
} 
+0

所以在完成获取活动后,我发送给renderweather的JSON对象json需要被分条为html.There,因为我会将此代码与renderweather分开,这是正确的吗? –

+0

你可以把stripHtmlResponse函数放在类的任何地方。并且在您收到响应对象的地方使用回溯JSONArray代码。 –

+0

我在代码的这部分有点遗失。 HttpEntity entity = response.getEntity(); String data = EntityUtils.toString(entity); String noHTML = stripHtml(data); 这显示为未定义的变量 我发送JSONObject JSON到striphtmlresponse它仍然是例外在当前时刻。 –