Atitit json序列化工具 JsonParserAtiver 参考 Atitit json序列化原理 序列化是将一个对象变成json格式的字符串,而反序列化是将json格式的字符串变

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);

}

 

}

 

猜你喜欢

转载自blog.csdn.net/attilax/article/details/85316740