Json-lib 自定义序列化和反序列化

来源:互联网 发布:php隐藏域名跳转代码 编辑:程序博客网 时间:2024/04/30 18:11

Json-lib 自定义序列化Java类属性和反序列化Java对象示例,序列化Java对象时排除public属性和transient字段,

package com.game.json;import java.lang.reflect.Field;import java.lang.reflect.Modifier;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Set;import net.sf.ezmorph.bean.MorphDynaBean;import net.sf.json.JSONArray;import net.sf.json.JSONException;import net.sf.json.JSONObject;import net.sf.json.JSONSerializer;import net.sf.json.JsonConfig;import net.sf.json.util.NewBeanInstanceStrategy;import net.sf.json.util.PropertyFilter;import net.sf.json.util.PropertySetStrategy;import org.apache.commons.beanutils.PropertyUtils;import org.apache.log4j.LogManager;import org.apache.log4j.Logger;public class JSONserializable {//日志private static Logger log = LogManager.getLogger(JSONserializable.class);/** * 字段缓存 第一层key为类的名字 第二层key为字段名称 */private static HashMap<String, HashMap<String, Field>> fields = new HashMap<String, HashMap<String, Field>>();/** * 序列化配置 */private static JsonConfig serializableConfig = new JsonConfig();//初始化static{// 忽略public字段serializableConfig.setIgnorePublicFields(true);// 忽略transient字段serializableConfig.setJsonPropertyFilter(new PropertyFilter() {/**true if the property will be filtered out, false otherwise * */public boolean apply(Object source, String name, Object value) {try {Field field = getDeclaredField(source.getClass(), name);// 检查是否为transient字段if (field != null&& Modifier.isTransient(field.getModifiers())) {return true;}} catch (Exception e) {e.printStackTrace();}return false;}});}/** * 反序列化配置 */private static JsonConfig unserializableConfig = new JsonConfig();//初始化static{//设置类初始化策略,过滤抽象类unserializableConfig.setNewBeanInstanceStrategy(new NewBeanInstanceStrategy() {@SuppressWarnings("rawtypes")@Overridepublic Object newInstance(Class c, JSONObject jo)throws InstantiationException, IllegalAccessException {//是否为抽象类if (Modifier.isAbstract(c.getModifiers())) {try {//返回类return Class.forName(jo.getString("clazz")).newInstance();} catch (Exception e) {e.printStackTrace();}}return c.newInstance();}});//设置属性赋值策略unserializableConfig.setPropertySetStrategy(new PropertySetStrategy() {@SuppressWarnings({ "unchecked", "rawtypes" })@Overridepublic void setProperty(Object bean, String key, Object value)throws JSONException {if(!(bean instanceof List) && !(bean instanceof Map) && !(bean instanceof Set)){if(getDeclaredField(bean.getClass(), key)==null){return;}}//value是否被反序列化为MorphDynaBeanif (value!=null && MorphDynaBean.class.isAssignableFrom(value.getClass())) {MorphDynaBean _bean = (MorphDynaBean) value;try{_bean.get("clazz");}catch (Exception e) {return;}try {//System.out.println((String)_bean.get("clazz"));Class clazz = null;try{clazz = Class.forName((String)_bean.get("clazz"));}catch (Exception e) {}if(clazz==null) return;// json反序列化JsonConfig jsonConfig = unserializableConfig.copy();jsonConfig.setRootClass(clazz);//重新反序列化value = JSONObject.toBean((JSONObject)JSONSerializer.toJSON(_bean, serializableConfig),jsonConfig);} catch (Exception e) {throw new JSONException( e );}}else if(value!=null && value instanceof List){List list = (List)value;if(list.size()==0) return;Object obj = list.get(0);if(MorphDynaBean.class.isAssignableFrom(obj.getClass())){List temp = new ArrayList();for (int i = 0; i < list.size(); i++) {MorphDynaBean _bean = (MorphDynaBean) list.get(i);try{_bean.get("clazz");}catch (Exception e) {continue;}try {//System.out.println((String)_bean.get("clazz"));Class clazz = null;try{clazz = Class.forName((String)_bean.get("clazz"));}catch (Exception e) {}if(clazz==null) return;// json反序列化JsonConfig jsonConfig = unserializableConfig.copy();jsonConfig.setRootClass(clazz);//重新反序列化temp.add(JSONObject.toBean((JSONObject)JSONSerializer.toJSON(_bean, serializableConfig),jsonConfig));} catch (Exception e) {throw new JSONException( e );}}value = temp;}}//赋值if (bean instanceof Map) {((Map) bean).put(key, value);} else {try {            PropertyUtils.setSimpleProperty( bean, key, value );        } catch( NoSuchMethodException e ) {        throw new JSONException( e );        } catch( Exception e ) {            throw new JSONException( e );        }}}});}/** * 序列化对象 * @param object 对象 * @return 字符串 */public static String toString(Object obj) {try{// 序列化Object object = JSONSerializer.toJSON(obj, serializableConfig);// 返回字符串return object.toString();}catch (Exception e) {log.error(e, e);log.error(JSONSerializer.toJSON(obj, serializableConfig));}return null;}/** * 反序列化对象 * @param data 序列化后的字符串 * @return 对象 */public static Object toObject(String data, Class<?> clazz) {try{// json反序列化JsonConfig jsonConfig = unserializableConfig.copy();// 设置反序列化类jsonConfig.setRootClass(clazz);//反序列化JSONObject object = JSONObject.fromObject(data);return JSONObject.toBean(object, jsonConfig);}catch (Exception e) {log.error(e, e);log.error(data);e.printStackTrace();}return null;}/** * 反序列化对象 * @param data 序列化后的字符串 * @return 对象 */public static Object toList(String data, Class<?> clazz) {try{// json反序列化JsonConfig jsonConfig = unserializableConfig.copy();// 设置反序列化类jsonConfig.setRootClass(clazz);//反序列化JSONArray object = JSONArray.fromObject(data);return JSONArray.toCollection(object, jsonConfig);}catch (Exception e) {log.error(e, e);log.error(data);e.printStackTrace();}return null;}/** * 取出类c中name字段 * @param c 类 * @param name 字段名 * @return 字段 */private static Field getDeclaredField(Class<?> c, String name) {// 缓存中是否储存了类包含的字段列表if (fields.containsKey(c.getName())) {// 取出要获取的字段return fields.get(c.getName()).get(name);} else {Class<?> _c = c;// 建立字段映射表HashMap<String, Field> fieldMap = new HashMap<String, Field>();// 循环获取c以及c父类的字段列表while (_c != null) {// 获得c的字段列表Field[] _fields = _c.getDeclaredFields();for (int i = 0; i < _fields.length; i++) {// 子类中是否已包含同名字段if (!fieldMap.containsKey(_fields[i].getName())) {// 不包含则放入fieldMap.put(_fields[i].getName(), _fields[i]);}}// 获得c的父类_c = _c.getSuperclass();}// 放入字段缓存fields.put(c.getName(), fieldMap);// 取出要获取的字段return fields.get(c.getName()).get(name);}}}


0 0
原创粉丝点击