2013-11-04 63 views
3

我想弄清楚JSON现在如何工作,所以我想有什么比制作一个小JSON读项目更好的方法!我希望用户使用EditText和Search按钮让用户使用并查看用户输入的网站是否有任何JSON,然后将其显示在文本框中。现在我测试的网站:itunes.apple.com/search?term=从目标主机获取JSON对象。错误:目标主机不能为空

正如你可以在我的代码中看到的,我只是设置这些变量没有的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(获得);但我不知道我是如何纠正主机为空。我觉得它与问号或某事有关。或者,也许我正在接近这个错误的方式。请考虑到这是我第一个使用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); 
    } 

} 
} 

回答

3

我想你错过了HTTP方案,所以不是:

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

地说:

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

编辑

即使这样做,解析JSON也会失败,因为这一行:JSONArray array = new JSONArray(data); - 假定响应是一个数组,但它是一个JSONObject,它包含两个条目:resultsCountresults。你需要使它成为JSONObjectJSONObject obj = new JSONObject(data);。互联网充满了android json parsing教程。这是一个relevant article

+0

非常感谢你的枪! –

相关问题