在开发中,发现 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 ; } }