3

JSON が現在どのように機能するかを理解しようとしているので、小さな JSON Reading Project を作成するよりも良い方法があると考えました! ユーザーが使用する EditText と検索ボタンを使用して、ユーザーが入力した Web サイトに JSON があるかどうかを確認し、それをテキスト ボックスに表示してもらいます。今、私はサイトをテストしています: itunes.apple.com/search?term=

私のコードでわかるように、これが機能するようになるまで、EditText と [検索] ボタンを使用せずにこれらの変数を設定しているだけです。次のエラーが表示されます。

11-03 20:30:58.545: E/AndroidRuntime(8608): FATAL EXCEPTION: AsyncTask #1
11-03 20:30:58.545: E/AndroidRuntime(8608): java.lang.RuntimeException: An error occured while executing doInBackground()
11-03 20:30:58.545: E/AndroidRuntime(8608):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
11-03 20:30:58.545: E/AndroidRuntime(8608):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
11-03 20:30:58.545: E/AndroidRuntime(8608):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
11-03 20:30:58.545: E/AndroidRuntime(8608):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
11-03 20:30:58.545: E/AndroidRuntime(8608):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-03 20:30:58.545: E/AndroidRuntime(8608):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
11-03 20:30:58.545: E/AndroidRuntime(8608):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
11-03 20:30:58.545: E/AndroidRuntime(8608):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
11-03 20:30:58.545: E/AndroidRuntime(8608):     at java.lang.Thread.run(Thread.java:856)
11-03 20:30:58.545: E/AndroidRuntime(8608): Caused by: java.lang.IllegalStateException:
 Target host must not be null, or set in parameters. scheme=null, host=null, path=itunes.apple.com/search

これは次の行によるものだと思います: HttpResponse r = client.execute(get); しかし、ホストをnullから修正する方法がわかりません。クエスチョンマークとか関係ある気がする。あるいは、私はこれに間違った方法でアプローチしているだけかもしれません。これが JSON を使用した最初のプロジェクトであることを考慮してください。JSON を完全に理解するには、JSON の使用に関する簡単なチュートリアルが必要かもしれません。ありがとう!

MainActivity.java

public class MainActivity extends Activity implements OnClickListener {

TextView fetchText;
EditText httpEntryBox,jsonEntryBox;
Button search_button_http, search_button_json;
HTTP_Fetcher http_fetch;

HttpClient client;
final static String URL = "itunes.apple.com/search?term=";
JSONObject json;
InputMethodManager imm;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    fetchText = (TextView) findViewById(R.id.fetchText);

    client = new DefaultHttpClient();
    new Read().execute("artistName");


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public JSONObject search( String searchItem ) throws ClientProtocolException, IOException, JSONException, URISyntaxException{
    StringBuilder url = new StringBuilder(URL);
    url.append(searchItem);

    String finished_url = url.toString();

    HttpGet get = new HttpGet(finished_url);
    HttpResponse r = client.execute(get);

    int status = r.getStatusLine().getStatusCode();

    if (status == 200){
        HttpEntity e = r.getEntity();
        String data = EntityUtils.toString(e);
        JSONArray array = new JSONArray(data);
        return array.getJSONObject(0);
    }else{
        Log.e("Search","fetch error");
        return null;
    }


}

public class Read extends AsyncTask<String, Integer, String>{

    @Override
    protected String doInBackground(String... params) {
        try {
            json = search("lilwayne");
            return json.getString(params[0]);
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        fetchText.setText(result);
    }

}
}
4

1 に答える 1

3

httpスキームが欠落していると思うので、代わりに:

final static String URL = "itunes.apple.com/search?term=";

置く:

final static String URL = "http://itunes.apple.com/search?term=";

編集
それが機能する場合でも、JSON の解析は次の行のために失敗します: - これは応答が配列であると想定していますが、2 つのエントリをJSONArray array = new JSONArray(data);含む JSONObject です: :にする必要があります。インターネットにはチュートリアルがあふれています。関連記事はこちらです。resultsCountresultsJSONObjectJSONObject obj = new JSONObject(data);android json parsing

于 2013-11-04T05:13:39.737 に答える