2017-11-03 9 views
0

私が始めてから、ここ5時間をここでサークルに費やしています。私はすべてのStackOverflowメソッドのようにAPIから単純なintのように見えるものを引っ張ってくるように思った。これは簡単なように思えるが、そうではない。AndroidのURLからJSONデータをプルする2017

http://api.apixu.com/v1/current.json?key=ENTERKEYHERE&q=leeds 

し、「7.0」の線に沿って何かする必要がありますカテゴリ「temp_c」を、収集:私は達成しようとしている何

は、このURLからJSON情報を引き出しています。私は成功したが、すべてのデータの特定の部分を引っ張ることができなかった、夜にランダムな点の間にアプリにプルするデータを得ている

{ 
    "location": { 
    "name": "Leeds", 
    "region": "West Yorkshire", 
    "country": "United Kingdom", 
    "lat": 53.81, 
    "lon": -1.54, 
    "tz_id": "Europe/London", 
    "localtime_epoch": 1509670055, 
    "localtime": "2017-11-03 0:47" 
    }, 
    "current": { 
    "last_updated_epoch": 1509669008, 
    "last_updated": "2017-11-03 00:30", 
    "temp_c": 7, 
    "temp_f": 44.6, 
    "is_day": 0, 
    "condition": { 
     "text": "Partly cloudy", 
     "icon": "//cdn.apixu.com/weather/64x64/night/116.png", 
     "code": 1003 
    }, 
    "wind_mph": 4.3, 
    "wind_kph": 6.8, 
    "wind_degree": 150, 
    "wind_dir": "SSE", 
    "pressure_mb": 1015, 
    "pressure_in": 30.4, 
    "precip_mm": 0, 
    "precip_in": 0, 
    "humidity": 93, 
    "cloud": 75, 
    "feelslike_c": 5.8, 
    "feelslike_f": 42.4, 
    "vis_km": 10, 
    "vis_miles": 6 
    } 
} 

:以下は、コールがどのように見えるかの例があります。現在のところ、私のアプリはまったくそれを引き出すことはありませんし、私は前に何をしたのか分かりません。

「duplicate」とみなされる質問があれば、本当に申し訳ありませんが、言語を習得しようとしている人にとっては、新しいAPIを使用してこれを行う方法を完全には説明していません答えはもはやAPI 23+では機能しないようです)

JSONデータをプルして特定のカテゴリを選択する簡単な方法はありません。将来コードを他のソースに適応させる計画を立てる際に、これを行う方法を説明することができれば非常に感謝しています。ありがとうございました!

答えて

0

AsyncTaskまたはAsyncTaskLoaderを使用して、UIスレッドがロード中に遅れないようにする必要があります。この用語を検索するかUIスレッドを使用しますが、読み込み中に遅れます。 Eitherways、URLがURLであることで、この関数を呼び出す:

public static String getResponse(URL url) throws IOException { 
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
    try { 
     InputStream in = urlConnection.getInputStream(); 
     Scanner scanner = new Scanner(in); 
     scanner.useDelimiter("\\A"); 
     boolean hasInput = scanner.hasNext(); 
     if (hasInput) { 
      return scanner.next(); 
     } else { 
      return null; 
     } 
    } finally { 
     urlConnection.disconnect(); 
    } 

URLは文字列を返す必要があります

url = new URL(yourAddressAsAString) 

上位functoinを呼び出すことによって得することができます。それは問題のオブジェクトを取得するには

String tempc = String.valueOf(obj.getJSONObject("current").getJSONObject("temp_c")) 

を呼び出すその後

  JSONObject obj = null; 
      try { 
       obj = new JSONObject(yourString); 
      } catch (Throwable t) {    } 

JSONオブジェクトに変換します。がんばろう!文字列(詳細は、コード内のコメントを読んで)ここStringjson_stringとは、あなたが何をすべきかと言うことができますよう

+0

これをまとめようとしていますが、少し混乱しています。最初のメソッドは、たとえばonCreate()から呼び出す必要があります。呼び出しが行われた後、onCreateに次のものが置かれますか?最初のコードとの関係でJSONオブジェクトに変換するコードをどこに配置するのかを実証できますか?あなたの詳細な答えをありがとう! – joshcawthorne

0

最初のステップは、あなたの全体のJsonを取る:

String json_string="your json string here as a normal String json object"; 

    try { 
     JSONObject jsonObjectRoot=new JSONObject(json_string); 
     JSONObject locationObject=jsonObjectRoot.getJSONObject("location"); 

     String name=locationObject.getString("name"); //This will return leeds 
     String region=locationObject.getString("region"); //This will return West YorkShire! 
    }catch (JSONException json_except){ 
     //You have an exception so check if your items really exist with those names! 
     json_except.printStackTrace(); 
    } 

したがって、上記の例からあなたを使用してあなたが知る必要がある独自のデータは次のとおりです。

  • すべてのJSONコードは、tryブロックとキャッチJSON例外にする必要があります。
  • 文字列から、我々は法outer_object.getJSONObject("string_name_of_inner_object");を使用して、あなたのオブジェクトを取得するまで、より深い続け任意の内側のJSONオブジェクト(JSONオブジェクト内のJSONオブジェクト)を取得するにnew JSONObject(string);
  • のようなだけでコンストラクタ自体をJSONオブジェクトを取得します。
  • 我々はあなたが私は、これはあなたを助けることを願っていますJSONArray jsonArray=your_json_object.getJSONArray("array_name_as_it_appears_in_json");

を使用したオブジェクト内のJSON配列を取得するにはString string=json_object.getString("the_string_name_as_it_appears_in_the_object");

  • を使用するオブジェクト内の文字列を取得するには!

  • 関連する問題