我正在尝试显示从开放天气图中获得的天气数据。数据似乎位于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;
}
}
}
答案 0 :(得分:0)
您需要从JSON响应中删除HTML,然后只有您能够检索JSONArray,然后您可以解析它以获取数据。如下所示:
public String stripHtmlResponse (String html) {
return Html.fromHtml(html).toString();
}
然后按如下方式从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代码。