Android数据存储之JSON数据解析(读取部分)

读取部分在输出部分项目中新建一个Activity即可。

本部分比输出部分要麻烦一些,主要流程为:以字符串形式读入json数据 ---> 解析字符串形式的json数据 ---> 在组件中显示数据

Activity组件等准备:

View Code
public class ReadJSONActivity extends Activity {

    private TextView dataText = null;
    private Button readJSONBtn = null;
    private File file = null;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_readjson);
        
        dataText = (TextView) findViewById(R.id.dataText);
        readJSONBtn = (Button) findViewById(R.id.readJSONBtn);
        
        readJSONBtn.setOnClickListener(new ReadJSONBtnListener());
        
    }

 

按钮事件绑定:

View Code
private class ReadJSONBtnListener implements OnClickListener {

        @Override
        public void onClick(View v) {
            // 首先调用检测储存环境的方法
            if(!ReadJSONActivity.this.checkEnvironment()) {
                return;
            } else {
                // 调用读取JSON方法
                readJSON();
                Toast.makeText(ReadJSONActivity.this, "成功读取JSON", Toast.LENGTH_SHORT).show();
            }
        }
        
    }

 

检测储存环境与输出部分一致,此处省略。

读入json数据方法:readJSON()

View Code
    private void readJSON() {
        String temp = null;
        // 取得输入流
        FileInputStream fis = null;
        BufferedReader br = null;
        try {
            fis = new FileInputStream(file);
            br = new BufferedReader(new InputStreamReader(fis));
            temp = br.readLine();
            // 调用显示数据方法,传入参数为parseJSON()方法传回的Map对象
            showJSONFile(parseJSON(temp));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null || fis != null) {
                    br.close();
                    br = null;
                    fis.close();
                    fis = null;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
    }

 

解析字符串形式的json数据方法:parseJSON()

View Code
    private Map<String, Object> parseJSON(String temp) throws JSONException {
        Map<String, Object> resultMap = new HashMap<String, Object>();
        JSONObject myJSONData = new JSONObject(temp);
        // 先读取单个数据
        resultMap.put("feature", myJSONData.getString("feature"));
        resultMap.put("favorite", myJSONData.getString("favorite"));
        // 再读取数组数据,先将JSONArray对象提取出来
        JSONArray myJSONArray = myJSONData.getJSONArray("info");
        List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
        for (int i = 0; i < myJSONArray.length(); i++) {
            // 遍历JSONArray中的JSONObject,把每个JSONObject的键值对填入一个临时Map对象中
            Map<String, Object> tempMap = new HashMap<String, Object>();
            JSONObject tempObject = myJSONArray.getJSONObject(i);
            tempMap.put("id", tempObject.getInt("id"));
            tempMap.put("name", tempObject.getString("name"));
            // 最终JSONArray中的所有JSONObject转化为list中的所有Map
            list.add(tempMap);
        }
        // 将整个list装入最终结果Map
        resultMap.put("info", list);
        return resultMap;
    }

 

显示数据方法:showJSONFile()

View Code
private void showJSONFile(Map<String, Object> resultMap) {
        StringBuffer buffer = new StringBuffer();
        // 先处理单个数据
        buffer.append("feature: " + resultMap.get("feature") + "\n");
        buffer.append("favorite: " + resultMap.get("favorite") + "\n");
        // 再处理数组数据
        List<Map<String, Object>> list = (List<Map<String, Object>>) resultMap.get("info");
        Iterator<Map<String, Object>> it = list.iterator();
        buffer.append("info: " + "\n");
        while (it.hasNext()) {
            Map<String, Object> tempMap = it.next();
            buffer.append(" id: " + tempMap.get("id") + "\n");
            buffer.append(" name: " + tempMap.get("name") + "\n");
        }
        
        // 显示数据
        ReadJSONActivity.this.dataText.setText(buffer.toString());
    }

 

显示效果:

posted @ 2013-05-10 13:49  来杯冰镇魔卡  阅读(766)  评论(0编辑  收藏  举报