如何将JSON数据解析到Android?

时间:2013-03-18 18:20:23

标签: android json

我已经在线学习了一些教程并调整了一些代码,我希望应用程序能够从不同的位置读取信息。目前,该应用正在从here正确读取数据。现在我想从here读取数据。我希望获得观察时间,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);
        }
    });
}

}

3 个答案:

答案 0 :(得分: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从互联网下载数据的正确方法。通过这种方式,它不会阻止您的用户界面,您的应用也会更具响应性。

希望这有帮助! :)

答案 1 :(得分:0)

最简单,最漂亮的方法是创建一个包含所需属性的DTO,然后使用 Jackson Gson 等库将JSON映射到对象(s )。然后它将是2行代码而不是“手动解析”。

答案 2 :(得分:0)

  

如何将JSON数据解析为Android?

首先,您应该将代码移动到尝试从网络连接(从JSON获取数据)到后台线程的位置。实际上你是在主(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");
   }
}
...