天気予報マップから取得した気象データを表示しようとしています。データは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);
}
}
である。これは、あなたはJSONレスポンスからHTMLを取り除く必要があり、その後にのみ、あなたがJSONArrayを取得することができるようになります
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;
}
}
}
を次のようにその後、私はあなたがウェブサーバとディスプレイから[アンドロイド、解析JSONデータを見てみましょう示唆JSONArrayからデータをretrive ListView](http://stackoverflow.com/a/36243380/2311047) –
データはjsonではありませんxmlにあります –
あなたのコードはJSONオブジェクトを呼び出しています –