Atitit json序列化工具 JsonParserAtiver
参考 Atitit json序列化原理
序列化是将一个对象变成json格式的字符串,而反序列化是将json格式的字符串变成对象。
所以,序列化就是获取对象所有的属性,变成key,属性值变成value.
反序列化就是将key变成对象的属性,value变成属性值。
至于具体的细节,你可以查看fastjaon源码
/webserviceS0/src/com/attilax/util/JsonParserAtiver.java
package com.attilax.util;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
import javax.swing.tree.DefaultMutableTreeNode;
import org.apache.commons.collections.bag.SynchronizedSortedBag;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import familyTreePkg.cantfindException;
public class JsonParserAtiver {
public static void main(String[] args) {
// 创建根节点
DefaultMutableTreeNode rootNode_DefaultMutableTreeNode = new DefaultMutableTreeNode("中国");
// 创建二级节点
DefaultMutableTreeNode gdNode = new DefaultMutableTreeNode("广东");
DefaultMutableTreeNode fjNode = new DefaultMutableTreeNode("福建");
DefaultMutableTreeNode shNode = new DefaultMutableTreeNode("上海");
DefaultMutableTreeNode twNode = new DefaultMutableTreeNode("台湾");
// 把二级节点作为子节点添加到根节点
rootNode_DefaultMutableTreeNode.add(gdNode);
rootNode_DefaultMutableTreeNode.add(fjNode);
rootNode_DefaultMutableTreeNode.add(shNode);
rootNode_DefaultMutableTreeNode.add(twNode);
String mapperStr = "userObject:name";
String fltOnlyShowField = "userObject,children";
Object jsonObj = new JsonParserAtiver().toJsonString(rootNode_DefaultMutableTreeNode, fltOnlyShowField,
mapperStr);
System.out.println(jsonObj);
// Field[] fields =DefaultMutableTreeNode.class.getFields();
// for (Field field : fields) {
// System.out.println(field.getName());
// }
//
//
// /**
// * EMPTY_ENUMERATION
// serialVersionUID
// EMPTY_ENUMERATION
// parent
// children
// userObject
// allowsChildren
// */
// Field[] getDeclaredFields
// =DefaultMutableTreeNode.class.getDeclaredFields();
// for (Field field : getDeclaredFields) {
// System.out.println(field.getName());
// }
}
private Object toJsonString(Object rootNode_DefaultMutableTreeNode, String fltOnlyShowField, String mapperStr) {
Map m = toJsonObject(rootNode_DefaultMutableTreeNode, fltOnlyShowField, mapperStr);
return JSON.toJSONString(m, true);
}
@SuppressWarnings("all")
private Map toJsonObject(Object rootNode_DefaultMutableTreeNode, String fltOnlyShowField, String mapperStr) {
Set<String> showfileds = getShowFieldsSet(fltOnlyShowField);
Map mapper = getMapper(mapperStr);
return toJsonObject(rootNode_DefaultMutableTreeNode, showfileds, mapper);
}
private Map toJsonObject(Object obj, Set<String> showfileds, Map mapper) {
Map m = Maps.newLinkedHashMap();
Field[] getDeclaredFields = obj.getClass().getDeclaredFields();
for (Field field : getDeclaredFields) {
String fldname = field.getName();
if (showfileds.contains(fldname)) {
System.out.println("dbg");
try {
Object fldVal = getFieldValueByFieldName(fldname, obj);
if (fldVal instanceof Vector)
fldVal = processList((List) fldVal, showfileds, mapper);
else if( fldVal instanceof List)
fldVal = processList((List) fldVal, showfileds, mapper);
String newFld = getMapedNewFld(mapper, fldname);
m.put(newFld, fldVal);
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException
| cantfindException e) {
e.printStackTrace();
}
System.out.println(fldname);
}
}
return m;
}
private String getMapedNewFld(Map mapper, String fldname) {
String newFld = (String) mapper.get(fldname);
if (newFld == null)
newFld = fldname;
return newFld;
}
private Object processList(List fldVal, Set<String> showfileds, Map mapper) {
List li = Lists.newArrayList();
for (Object object : fldVal) {
Object siriedObj;
//group by diff instace
if (object instanceof Map) {
siriedObj = object;
} else
siriedObj = toJsonObject(object, showfileds, mapper);
li.add(siriedObj);
}
return li;
}
private Map getMapper(String mapperStr) {
String[] flds = mapperStr.split(",");
Map mapper = Maps.newConcurrentMap();
for (String fldKv : flds) {
String[] fldkv_a = fldKv.split(":");
mapper.put(fldkv_a[0], fldkv_a[1]);
}
return mapper;
}
private Set<String> getShowFieldsSet(String fltOnlyShowField) {
String[] flds = fltOnlyShowField.split(",");
Set<String> st = Sets.newLinkedHashSet();
for (String string : flds) {
st.add(string);
}
return st;
}
private Object toJsonString(Object rootNode_DefaultMutableTreeNode) {
Map m = toJsonObject(rootNode_DefaultMutableTreeNode);
return JSON.toJSONString(m, true);
}
private Map toJsonObject(Object rootNode_DefaultMutableTreeNode) {
Map m = Maps.newLinkedHashMap();
Field[] getDeclaredFields = DefaultMutableTreeNode.class.getDeclaredFields();
for (Field field : getDeclaredFields) {
String fldname = field.getName();
if (fldname.equals("children") || fldname.equals("userObject")) {
System.out.println("dbg");
try {
Object fldVal = getFieldValueByFieldName(fldname, rootNode_DefaultMutableTreeNode);
if (fldVal instanceof Vector)
fldVal = processList((Vector) fldVal);
m.put(fldname, fldVal);
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException
| cantfindException e) {
e.printStackTrace();
}
System.out.println(fldname);
}
}
return m;
}
private Object processList(Vector fldVal) {
List li = Lists.newArrayList();
for (Object object : fldVal) {
Map m = toJsonObject(object);
li.add(m);
}
return li;
}
private Object getFieldValueByFieldName(String fieldName, Object object)
throws IllegalAccessException, cantfindException, NoSuchFieldException, SecurityException {
if (fieldName == null)
throw new cantfindException(fieldName);
Field field;
try {
field = object.getClass().getField(fieldName);
} catch (NoSuchFieldException e) {
field = object.getClass().getDeclaredField(fieldName);
}
// 设置对象的访问权限,保证对private的属性的访问
field.setAccessible(true);
return field.get(object);
}
}