0

我遵循了在线教程并调整了一些代码,我希望应用程序从不同的位置读取信息。目前,该应用程序正在从此处正确读取数据。现在我想从这里读取数据。我希望获得观察时间、Temp_C 和可见性,我想我需要在 try { 括号内更改我的代码才能读取这些数据?有什么建议么?

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);
        }
    });
}

}

4

3 回答 3

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例如从互联网下载数据的正确方法。通过这种方式,它不会阻塞您的 UI,并且您的应用程序将更具响应性。

希望这有帮助!:)

于 2013-03-18T18:28:08.573 回答
0

最简单和最漂亮的方法是创建一个具有所需属性的 DTO,然后使用诸如JacksonGson之类的库将 JSON 映射到对象。然后它将是 2 行代码,而不是“手动解析”。

于 2013-03-18T18:32:15.463 回答
0

如何将 JSON 数据解析到 Android?

因此,首先您应该将尝试执行网络连接(从 JSON 获取数据)的代码移动到后台线程。实际上你是在 Main(UI) Thread 做的,它不是很好也不正确。如果您的应用程序将安装在运行 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");
   }
}
...
于 2013-03-18T18:35:10.593 回答