网络请求到的json对象base64保存

在开发中,发现 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 ;
    }
}
原文地址:https://www.cnblogs.com/bobodeboke/p/3030016.html