在開發中,發現 1,向網絡發送請求,獲得json字符串——>2,將請求到的json字符串進行解析(一般可以解析為List<Map<String,Object>>對象)——>3,將解析到的對象通過base64編碼后存儲到文件中。在自己的項目中是SendRequst,jsonHelper,FileManager三個類的配合使用。
其實,也可以采用不同的策略,建立對應的實體對象,在保存的時候,僅僅用sp文件的一個鍵值對保存整個json字符串,在使用的時候才進行解析。
一、首先准備一個ArrayMap類,該類實現序列化接口,便於存儲
package com.bobo.util; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Map; public class ArrayMap implements Serializable{ public List<Map<String,Object>> list=new ArrayList<Map<String,Object>>(); }
二、sendRequest類,向網絡發送請求,並且調用底層類進行相關解析和存儲
package com.bobo.web; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import com.bobo.util.ArrayMap; import com.bobo.util.Constant; import com.bobo.util.JsonHelper; import android.content.SharedPreferences; /** * 這個類主要用於發送網絡請求 * @author lixueyi * */ public class SendRequest { //向網絡發送get請求,並且將請求到的數據進行解析,保存在sp文件中 //這里使用一個數字進行標識,不同的表示代表調用不同的json解析方法 public List<Map<String,Object>> sendGetRequest(String url,SharedPreferences sp,String key,int type){ ArrayMap arrayMap=new ArrayMap(); HttpGet get=new HttpGet(url); try { HttpResponse response=new DefaultHttpClient().execute(get); if(response.getStatusLine().getStatusCode()==200){ String result=EntityUtils.toString(response.getEntity()); if(result!=null&&!result.equals("")){ new JsonHelper().parse(arrayMap,result,sp,key,type); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return arrayMap.list; } }
三、JSONHelper類,主要實現json字符串的解析
package com.bobo.util; import java.util.HashMap; import java.util.List; import java.util.Map; import org.json.JSONArray; import org.json.JSONObject; import com.bobo.util.Constant; import android.content.SharedPreferences; public class JsonHelper { public void parse(ArrayMap arrayMap, String result, SharedPreferences sp, String key, int type) { switch (type) { case Constant.GET_LEVEL_INFO: // 獲取信息 getLevelInfo(arrayMap, result, sp, key); break; } } // 這個是用來解析level信息的 private void getLevelInfo(ArrayMap arrayMap, String result, SharedPreferences sp, String key) { // 這里進行leveljson文件的解析 JSONObject jsonObject = null; JSONArray jsonArray = null; try { jsonObject = new JSONObject(result); jsonArray = jsonObject.getJSONArray("datalist"); for (int i = 0; i < jsonArray.length(); i++) { Map<String, Object> map2 = new HashMap<String, Object>(); JSONObject jsonOb = (JSONObject) jsonArray.opt(i); map2.put("level", jsonOb.getString("level")); map2.put("time", jsonOb.getString("time")); if (i == jsonArray.length() - 1) { map2.put("aqi", jsonOb.getString("aqi")); map2.put("major", jsonOb.getString("major")); map2.put("no2", jsonOb.getString("no2")); map2.put("pm10", jsonOb.getString("pm10")); map2.put("pm25", jsonOb.getString("pm25")); map2.put("so2", jsonOb.getString("so2")); } arrayMap.list.add(map2); } Map<String, Object> map = new HashMap<String, Object>(); map.put("cnname", jsonObject.getString("cnname")); map.put("date", jsonObject.getString("date")); arrayMap.list.add(map); FileManager.saveInfo(arrayMap, sp, key); } catch (Exception e) { e.printStackTrace(); } } }
四、FileManager類,完成對象的存儲和讀取,使用到了BASE64編解碼的技術
package com.bobo.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.StreamCorruptedException; import java.util.List; import java.util.Map; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.util.Base64; public class FileManager { /** * 將對象進行base64編碼之后保存 * * @param arrayMap * @param sp * @param key */ public static void saveInfo(ArrayMap arrayMap, SharedPreferences sp, String key) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { ObjectOutputStream os = new ObjectOutputStream(baos); os.writeObject(arrayMap); // 之后進行base64編碼 String base64String = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT); System.out.println(base64String); // 將這個字符串保存到sp文件中 Editor editor = sp.edit(); editor.putString(key, base64String); editor.commit(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static List<Map<String, Object>> readInfo(SharedPreferences sp, String key) { ArrayMap arrayMap=null; String base64String = sp.getString(key, null); // 進行base64解碼 String result = new String(Base64.decode(base64String, Base64.DEFAULT)); // ByteArrayInputStream is=new // ByteArrayInputStream(base64String.getBytes()); // 將解碼之后的字符串轉換為對象 ByteArrayInputStream is = new ByteArrayInputStream(Base64.decode( base64String, Base64.DEFAULT)); try { ObjectInputStream ois = new ObjectInputStream(is); arrayMap = (ArrayMap) ois.readObject(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return arrayMap.list ; } }