2016-09-11 15 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); 
    } 
} 

である。これは、あなたは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; 
     } 
    } 
} 
+0

を次のようにその後、私はあなたがウェブサーバとディスプレイから[アンドロイド、解析JSONデータを見てみましょう示唆JSONArrayからデータをretrive ListView](http://stackoverflow.com/a/36243380/2311047) –

+0

データはjsonではありませんxmlにあります –

+0

あなたのコードはJSONオブジェクトを呼び出しています –

答えて

0

Javaクラスフェッチこれを解析してデータを取得することができます。ソース

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

:以下のようなHow to strip HTML tags

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 Object jsonはhtmlのストライプされている必要があります。私はこのコードをレンダウェイターの別に置くことは正しいでしょうか? –

+0

stripHtmlResponse関数をクラスの任意の場所に配置できます。レスポンスオブジェクトを受け取った場所でJSONArrayコードを取得してください。 –

+0

私はコードのこの部分で少し失われています。 HttpEntityエンティティ= response.getEntity(); 文字列データ= EntityUtils.toString(エンティティ); 文字列noHTML = stripHtml(data); これは未定義の変数として表示されます JSONObject jsonをstriphtmlresponseに送信しましたが、現在の瞬間に例外があります。 –

関連する問題