2013-03-18 97 views
0

我在線學習了一個教程,並調整了一些代碼,我希望應用程序從不同位置讀取信息。目前該應用程序正在正確讀取來自here的數據。現在我想從here讀取數據。我期望獲得觀察時間,Temp_C &可見性,我想我需要在try {括號內更改我的代碼以讀取此數據?有什麼建議麼?如何解析JSON數據到Android?

public class MainActivity extends ListActivity { 

// url to make request 
private static String url = "http://api.androidhive.info/contacts/"; 

// JSON Node names 
private static final String TAG_DATA = "contacts"; 
private static final String TAG_OBSERV = "name"; 
private static final String TAG_TEMP = "email"; 
private static final String TAG_VISIB = "gender"; 

// contacts JSONArray 
JSONArray contacts = null; 

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

    // Hashmap for ListView 
    ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>(); 

    // Creating JSON Parser instance 
    JSONParse jParser = new JSONParse(); 

    // getting JSON string from URL 
    JSONObject json = jParser.getJSONFromUrl(url); 

    try { 
     // Getting Array of Contacts 
     contacts = json.getJSONArray(TAG_DATA); 

     // looping through All Contacts 
     for(int i = 0; i < contacts.length(); i++){ 
      JSONObject c = contacts.getJSONObject(i); 

      // Storing each json item in variable 
      String name = c.getString(TAG_OBSERV); 
      String email = c.getString(TAG_TEMP); 
      String gender = c.getString(TAG_VISIB); 

      // creating new HashMap 
      HashMap<String, String> map = new HashMap<String, String>(); 

      // adding each child node to HashMap key => value 
      map.put(TAG_OBSERV, name); 
      map.put(TAG_TEMP, email); 
      map.put(TAG_VISIB, gender); 

      // adding HashList to ArrayList 
      contactList.add(map); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    // Updating parsed JSON data into ListView 
    ListAdapter adapter = new SimpleAdapter(this, contactList, 
      R.layout.list_item, 
      new String[] { TAG_OBSERV, TAG_TEMP, TAG_VISIB }, new int[] { 
        R.id.name, R.id.email, R.id.mobile }); 

    setListAdapter(adapter); 

    // selecting single ListView item 
    ListView lv = getListView(); 

    // Launching new screen on Selecting Single ListItem 
    lv.setOnItemClickListener(new OnItemClickListener() { 

     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      // getting values from selected ListItem 
      String name = ((TextView) view.findViewById(R.id.name)).getText().toString(); 
      String cost = ((TextView) view.findViewById(R.id.email)).getText().toString(); 
      String description = ((TextView) view.findViewById(R.id.mobile)).getText().toString(); 

      // Starting new intent 
      Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class); 
      in.putExtra(TAG_OBSERV, name); 
      in.putExtra(TAG_TEMP, cost); 
      in.putExtra(TAG_VISIB, description); 
      startActivity(in); 
     } 
    }); 
} 

}

+0

請將您的代碼降低到最低程度。一般來說,你可以用'outer.getJSONObject(「name」)''讀取*子對象*(像''name':{...}'')。 – rekire 2013-03-18 18:25:56

回答

0

如何解析JSON數據到Android?

所以起初你應該把你的代碼移動到你試圖從網絡連接(從JSON獲取數據)到後臺線程的地方。實際上你在Main(UI)線程中執行它,它不是很好,也不正確。如果您的應用程序將安裝在運行Android 3.0或更高版本的設備上,您將獲得NetworkOnMainThreadException,這並不好,不是嗎?

其次,保存您的JSON並進行一些格式化以更好地查看其結構。 Multiset括號{表示JSONObject和括號[表示JSONArray。

現在你應該能夠解析JSON。現在我寫你一小段代碼如何開始:

JSONObject o = new JSONObject(sourceString); 
if (o != null) { 
    JSONObject data = o.getJSONObject("data"); // getting JSONObject with key data 
    if (data != null) { 
     JSONArray current = data.getJSONArray("current_condition"); 
    } 
} 
... 
0

這裏是你應該分析和從該JSON讓您的值的方式:

JSONObject mMainObject = new JSONObject(myResponseString); 
if(mMainObject != null){ 
    JSONObject data = mMainObject.getJSONObject("data"); 
    if(data != null){ 
     JSONArray currentCondition = data.getJSONArray("current_condition"); 
     if(currentCondition != null){ 
      for(int i = 0; i < currentCondition.lenght(); i++){ 
       JSONObject obj = currentCondition.get(i); 
       if(obj != null){ 
        String observation_time = obj.getString("observation_time"); 
        String temp_C = obj.getString("temp_C"); 
        String visibility = obj.getString("visibility"); 
       } 
      } 
     } 
    } 
} 

這樣做,你應該考慮適當的方式從互聯網上下載的數據使用AsyncTask例如。通過這種方式,它不會阻止你的用戶界面,並且你的應用會更加快速響應。

希望得到這個幫助! :)

+0

如果有多個數組需要從JSON文件中檢索,我們不需要使用FOR循環嗎? – Si8 2013-11-08 22:11:15

0

的最簡單和最漂亮的方式是創建一個DTO與想要的屬性,然後使用一個庫如傑克遜GSON映射JSON來(多個)對象。然後它將是2行代碼,而不是「手動解析」。