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(ObjectrootNode_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);
}
}
Atitit json序列化工具 JsonParserAtiver 参考 Atitit json序列化原理 序列化是将一个对象变成json格式的字符串,而反序列化是将json格式的字符串变相关推荐
- jackson、fastjson、kryo、protostuff等序列化工具性能对比
简介 实际项目中,我们经常需要使用序列化工具来存储和传输对象.目前用得比较多的序列化工具有:jackson.fastjson.kryo.protostuff.fst 等,本文将简单对比这几款工具序列化 ...
- 解决Python自带的json序列化工具不能序列化datetime类型数据问题
解决Python自带的json序列化工具不能序列化datetime类型数据问题 参考文章: (1)解决Python自带的json序列化工具不能序列化datetime类型数据问题 (2)https:// ...
- 【Flutter】JSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )
文章目录 一.JSON 序列化工具 二.JSON 手动序列化 三.根据 JSON 编写 Dart 模型类 四.在线自动转换 五.相关资源 一.JSON 序列化工具 JSON 格式比较简单的话 , 使用 ...
- 迄今为止最快的 JSON 序列化工具 Jil
2019独角兽企业重金招聘Python工程师标准>>> 迄今为止最快的 JSON 序列化工具 Jil https://github.com/kevin-montrose/Jil 转载 ...
- .NET序列化工具Jil、Json.NET和Protobuf的简单测评
前一段时间逛园子的时候发现有人比较了Jil.Json.NET和Protobuf的性能,一时好奇,也做了个测试,这里记录下来,以供查阅. 前期准备 依赖类库的话,可以通过Nuget在公共组件库总下载,这 ...
- 高效的JSON转换工具
在网上搜索了一番发现用json-lib进行json格式转换的还真不少,但是经过测试性能不太令人满意,同类工具中还有个后起 之秀那就是jackson,单从性能上说要比json-lib好很多,于是在项目中 ...
- Json解析工具Jackson(使用注解)
接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给我们提供了一系列注解,提高了开发的灵活性,下面介绍一下最常用的一些注解 @JsonIgnoreProperties ...
- java json 工具类_Java中JSON处理工具类使用详解
本文实例为大家分享了JSON处理工具类的具体代码,供大家参考,具体内容如下 import java.io.IOException; import java.util.Date; import java ...
- 码农必备,一款超好用Json编辑工具
DevWeekly收集整理每周优质开发者内容,包括开源项目.资源工具.技术文章等方面. 每周五定期发布,同步更新到 知乎:Jackpop . 欢迎大家投稿,提交issue,推荐或者自荐开源项目/资源/ ...
- json解析工具(json解析工具 python)
常用的xml,json解析工具有哪些 1.定义介绍 (1).XML定义 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可 ...
最新文章
- pythongetattribute_对Github上Python开源项目进行分析时遇到的一个AttributeError的解释及其解决方法。...
- 转载:从集群计算到云计算
- 力扣——回文数(Java)
- Linux中常用的操作指令(随时更新)
- 【递推】Ayoub and Lost Array
- 使用Exchange反垃圾邮件组件解决内部仿冒邮件
- Python_遍历时删除的处理说明
- java合并表的两行_如何通过SQL将不同数据库表中记录两行合并为一行
- Java关键字this与super的用法详解
- ‘catkin_make‘ is currently not installed问题修复
- android最新系统排行,四大安卓系统排名,Flyme最好?
- Linux下进行rar文件解压和压缩
- 论文速递-ANALYSIS OF VISUAL REASONING ON ONE-STAGE OBJECT DETECTION
- print spooler打印服务启动后,自动停止的解决方法。
- Qt利用QGraphicsScene编写Word排版工具导出PDF
- 【arcpy批量制图】符号系统的色带、小数点设置
- Win10应用程序无法正常启动 提示0xc0000142怎么解决?
- 一些鲜为人知的编程真相
- 三菱plc搭配四轴雅马哈机械手在线检测收料案例程序
- 智能,好用,免费! 机器人接口分享,API,认知智能机器人接口。