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 IllegalAccessExceptioncantfindExceptionNoSuchFieldExceptionSecurityException {

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格式的字符串变相关推荐

  1. jackson、fastjson、kryo、protostuff等序列化工具性能对比

    简介 实际项目中,我们经常需要使用序列化工具来存储和传输对象.目前用得比较多的序列化工具有:jackson.fastjson.kryo.protostuff.fst 等,本文将简单对比这几款工具序列化 ...

  2. 解决Python自带的json序列化工具不能序列化datetime类型数据问题

    解决Python自带的json序列化工具不能序列化datetime类型数据问题 参考文章: (1)解决Python自带的json序列化工具不能序列化datetime类型数据问题 (2)https:// ...

  3. 【Flutter】JSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )

    文章目录 一.JSON 序列化工具 二.JSON 手动序列化 三.根据 JSON 编写 Dart 模型类 四.在线自动转换 五.相关资源 一.JSON 序列化工具 JSON 格式比较简单的话 , 使用 ...

  4. 迄今为止最快的 JSON 序列化工具 Jil

    2019独角兽企业重金招聘Python工程师标准>>> 迄今为止最快的 JSON 序列化工具 Jil https://github.com/kevin-montrose/Jil 转载 ...

  5. .NET序列化工具Jil、Json.NET和Protobuf的简单测评

    前一段时间逛园子的时候发现有人比较了Jil.Json.NET和Protobuf的性能,一时好奇,也做了个测试,这里记录下来,以供查阅. 前期准备 依赖类库的话,可以通过Nuget在公共组件库总下载,这 ...

  6. 高效的JSON转换工具

    在网上搜索了一番发现用json-lib进行json格式转换的还真不少,但是经过测试性能不太令人满意,同类工具中还有个后起 之秀那就是jackson,单从性能上说要比json-lib好很多,于是在项目中 ...

  7. Json解析工具Jackson(使用注解)

    接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给我们提供了一系列注解,提高了开发的灵活性,下面介绍一下最常用的一些注解 @JsonIgnoreProperties ...

  8. java json 工具类_Java中JSON处理工具类使用详解

    本文实例为大家分享了JSON处理工具类的具体代码,供大家参考,具体内容如下 import java.io.IOException; import java.util.Date; import java ...

  9. 码农必备,一款超好用Json编辑工具

    DevWeekly收集整理每周优质开发者内容,包括开源项目.资源工具.技术文章等方面. 每周五定期发布,同步更新到 知乎:Jackpop . 欢迎大家投稿,提交issue,推荐或者自荐开源项目/资源/ ...

  10. json解析工具(json解析工具 python)

    常用的xml,json解析工具有哪些 1.定义介绍 (1).XML定义 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可 ...

最新文章

  1. pythongetattribute_对Github上Python开源项目进行分析时遇到的一个AttributeError的解释及其解决方法。...
  2. 转载:从集群计算到云计算
  3. 力扣——回文数(Java)
  4. Linux中常用的操作指令(随时更新)
  5. 【递推】Ayoub and Lost Array
  6. 使用Exchange反垃圾邮件组件解决内部仿冒邮件
  7. Python_遍历时删除的处理说明
  8. java合并表的两行_如何通过SQL将不同数据库表中记录两行合并为一行
  9. Java关键字this与super的用法详解
  10. ‘catkin_make‘ is currently not installed问题修复
  11. android最新系统排行,四大安卓系统排名,Flyme最好?
  12. Linux下进行rar文件解压和压缩
  13. 论文速递-ANALYSIS OF VISUAL REASONING ON ONE-STAGE OBJECT DETECTION
  14. print spooler打印服务启动后,自动停止的解决方法。
  15. Qt利用QGraphicsScene编写Word排版工具导出PDF
  16. 【arcpy批量制图】符号系统的色带、小数点设置
  17. Win10应用程序无法正常启动 提示0xc0000142怎么解决?
  18. 一些鲜为人知的编程真相
  19. 三菱plc搭配四轴雅马哈机械手在线检测收料案例程序
  20. 智能,好用,免费! 机器人接口分享,API,认知智能机器人接口。

热门文章

  1. hashcode值一样对象一定相同吗_你所不知道的HashCode
  2. 12、NIO--Path、、Paths、Files
  3. 表格存储(TableStore)
  4. zabbix 3.0.7 for Centos 7.2 安装
  5. 用DD-WRT自建计费WiFi热点
  6. 【转】spring MVC入门示例(hello world demo)
  7. 设置嵌入式系统开机自动启动程序
  8. 【2013高考作文】重庆作文
  9. 003_如何正确的进入容器
  10. Linux安装redis及redis的php扩展。