介绍

gitee

https://gitee.com/jiangjinghong520/servlet/tree/master/
在json包里面
有空再完善思路,最近没时间,都是临时想法临时写

功能

目前想完成的就是json转Java对象,Java对象转json。

1、对象转json

思路:我把对象转json的类型分为两大类,第一是我们自己定义的引用数据类型,第二是像int,long,float,double,String,boolean系统定义的。其实我感觉这个就像一个多叉树,最底层就是int,long,double,String,boolean,float这些类型。下面代码:教室类有名称String类型,和学生数组Student,学生里面有名称String类型,年龄int类型。你只要深搜一下遇到int,long,double,String,boolean,float这些类型或者是他们的数组,停止深搜就ok了。

public class Clazz {private String clazzName = "网络1906";private static Student[] student = new Student[2];static {student[0] = new Student();student[1] = new Student();}
}
public class Student {private String name = "jjx";private int age = 21;private int[] ints = new int[10];private Integer[] integers = new Integer[10];}
  1. Json接口主要是为了实例化JsonEntrust
  2. JsonArrayAndBasic是为了处理int,long,float,double,String,boolean这些类型的,包括他们的数组类型。
  3. JsonObject是解决处理上面那些类型之外的类型

代码

// 处理自定义类
public class JsonArrayAndBasicCome implements JsonArrayAndBasic {private final static String RIGHT = "[";private final static String LEFT = "]";private final String start = "\"";private JsonArrayAndBasicCome(){}/*** 单例模式* @return*/public static JsonArrayAndBasicCome getJsonArrayCome(){return InitJsonArrayCome.jsonArrayCome;}private interface InitJsonArrayCome{JsonArrayAndBasicCome jsonArrayCome = new JsonArrayAndBasicCome();}public String before(String val, Object obj){Class<?> clazz = obj.getClass();String typeName = clazz.getTypeName();int index;if ((index = typeName.indexOf("[")) != -1){typeName.substring(0, index);}if (!typeName.endsWith("String")){return val;}return start + val + start;}@Overridepublic String basicArrayToString(Object obj) {if (obj == null){return null;}Class<?> clazz = obj.getClass();if (clazz.isArray()){int len = Array.getLength(obj);StringBuilder json = new StringBuilder().append(RIGHT);for (int i = 0; i < len; i++) {basicArrayToString(Array.get(obj,i));if (json.length() != 1 && !json.equals("") && i != len - 1){json.append(",");}}json.append(LEFT);return json.toString();}if (obj == null || "".equals(obj.toString()) || obj.toString().length() == 0){return "";}return before(obj.toString(), obj);}
}
// 处理int,long,float,double,String,boolean这些基础类型,包括它们的数组和它们的类Integer,Long,Float,Double,Boolean这些类型包括它们的数组。
public class JsonObjectCome implements JsonObject{private final String right = "{";private final String left = "}";private JsonObjectCome(){if (JsonObjectComeHolder.jsonObjectCome != null){throw new RuntimeException();}}private static class JsonObjectComeHolder{private static final JsonObjectCome jsonObjectCome = new JsonObjectCome();}public static JsonObjectCome getJsonObjectCome(){return JsonObjectComeHolder.jsonObjectCome;}@Overridepublic String transString(Object...obj) {if (obj.length == 0){return "";}else if (obj.length == 1 && obj[0] instanceof String){return (String) obj[0];}StringBuilder json = new StringBuilder();json.append(right);for (int i = 0; i < obj.length; i++) {Class<?> clazz = obj[i].getClass();Field[] fields = clazz.getDeclaredFields();try{for (int j = 0; j < fields.length; j++){json.append(jsonFactory.invokeMethodToString(fields[j],obj[i]));if ((j ^ fields.length - 1) != 0){json.append(",");}}}catch (Exception e){e.printStackTrace();}}json.append(left);return json.toString();}public static void main(String[] args) {System.out.println(JsonObjectCome.getJsonObjectCome().transString(new Clazz()));}@Overridepublic Object transObj(String json, Class<?> clazz) {return null;}
}
//这个类主要的作用是:判断当前的类型应该是进入JsonObjectCome还是JsonArrayAndBasicCome。就是判断当前对象是基础类型还是自定义类型,然后进入不同的处理逻辑
public class JsonEntrust {private List<String> jsonKey = new ArrayList<>();private JsonArrayAndBasic jsonArray = JsonArrayAndBasicCome.getJsonArrayCome();private final String lz = "]";private final String rz = "[";/*** 扫描*/public JsonEntrust() {try {// 初始化最小单位类型Class<?> clazz = FiledJsonKey.class;Field[] fields = clazz.getDeclaredFields();for (Field f : fields) {if (f.getType().getTypeName().endsWith("Map")) {continue;}f.setAccessible(true);String val = (String) f.get(FiledJsonKey.class);jsonKey.add(val);}} catch (Exception e) {e.printStackTrace();}}/*** 处理单纯的键值对** @param f* @param obj0* @return* @throws Exception*/public String invokeMethodToString(Field f, Object obj0) throws Exception {// 消除[]括号String typeName = f.getType().getTypeName();int index;if ((index = typeName.indexOf(rz))!= -1){typeName = typeName.substring(0 , index);}f.setAccessible(true);// 判断是不是FiledJsonKey定义的类型if (!jsonKey.contains(typeName)) {JsonObjectCome jsonObjectCome = JsonObjectCome.getJsonObjectCome();// 如果属性是基本数据类型可能会存在f.get(obj0)=nullObject obj = f.get(obj0);Class<?> clazz = null;if (obj != null){clazz = f.get(obj).getClass();}// 判断对象是否是数组类型StringBuilder json = new StringBuilder();if (clazz != null && clazz.isArray()) {int length = Array.getLength(obj);json.append("\"").append(f.getName()).append("\"").append(":").append(rz);for (int i = 0; i < length; i++) {// 处理对象json.append(jsonObjectCome.transString(Array.get(obj, i)));if (i != length - 1){json.append(",");}}json.append(lz);} else {json.append("\"" + f.getName() + "\"").append(":").append(jsonObjectCome.transString(obj));}return json.toString();} else {Object obj = f.get(obj0);// 处理定义的基本数据- FiledJsonKey里面定义的return "\"" + f.getName() + "\"" + ":" + jsonArray.basicArrayToString(obj);}}private interface FiledJsonKey {String INT = "int";String LONG = "long";String FLOAT = "float";String DOUBLE = "double";String BOOLEAN = "boolean";String STRING = "java.lang.String";String INTEGER = "java.lang.Integer";String LONGClazz = "java.lang.Long";String DOUBLEClazz = "java.lang.Double";String FLOATClazz  = "java.lang.Float";String BOOLEANClazz = "java.lang.Boolean";}
}

效果

2、json转对象

有空再写思路

public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {class A{String name = "A";Integer age = 9;Integer[][] integers;}class B{String name = "B";Integer age = 90;A[] as = new A[2];{as[0] = new A();as[1] = new A();}@Overridepublic String toString() {return "B{" +"name='" + name + '\'' +", age=" + age +", as=" + Arrays.toString(as) +'}';}}B b = new B();b.age = 10;b.name = "jjx";// 对象转jsonString json = JsonObjectCome.getJsonObjectCome().transString(b);System.out.println(json);// json转对象Object obj = JsonObjectCome.getJsonObjectCome().transObj(json, B.class);System.out.println(obj);}

效果

Java自己写一个json转换器,对象转json,json转对象相关推荐

  1. Java 手写一个SQL分页

    Java手写一个类似PageHelper的分页SQL 目前分页插件众所周知的莫过于和mybatis完美融合的PageHelper了,简单两行代码就实现了sql分页,配合PageInfo类,将数据总数量 ...

  2. Java (1)写一个类,名为Animal, 该类有两个私有属性,name(代表动物的名字),和legs(代表动物的腿的条数);要求为两个私有属性提供public的访问方法。并提供两个重载的构造方法,

    Java (1)写一个类,名为Animal, 该类有两个私有属性,name(代表动物的名字),和legs(代表动物的腿的条数);要求为两个私有属性提供public的访问方法.并提供两个重载的构造方法, ...

  3. 如何用Java自己写一个.exe程序

    如何用Java自己写一个.exe程序 之前遇到要写一个 .exe程序的一个题,后面在网上查阅资料,发现Java其实也是可以转换成exe程序的,但是要借助一些工具生成,我是用exe4j生成.exe程序. ...

  4. java nextline_Java写一个学生管理系统

    前言 其实作为一名Java的程序猿,无论你是初学也好,大神也罢,学生管理系统一直都是一个非常好的例子,初学者主要是用数组.List等等来写出一个简易的学生管理系统,二.牛逼一点的大神则用数据库+swi ...

  5. java爬虫写一个百度图片下载器

    文章目录 img_download 1.0 看看效果吧 2.0 了解一下 "图片下载器软件" 目录结构 3.0 如何使用? 4.0 源码剖析 5.0 项目地址 6.0 写在最后的话 ...

  6. 用java简单写一个信息管理系统(尚硅谷项目二)

    1.项目要求 模拟实现基于文本界面的<客户信息管理软件>. 该软件能够实现对客户对象的插入.修改和删除(用数组实现),并能够打印客户明细表 2.将项目抽象为几个类 我们可以先将项目抽离为几 ...

  7. 用Java手写一个微型下载资源网站

    文章目录 手写一个微型下载资源网站[Java实现用户注册.登陆.下载功能] 一.技术栈 二.流程分析图 注册 登陆 下载 三.案例实现效果 首页 注册 登陆 下载网主页 壁纸下载 书籍下载 影视下载 ...

  8. 用 Java 手写一个植物大战僵尸简易版!

    点击上方"终端研发部",选择"星标" 回复"资源",领取全网最火的Java核心知识总结~ 公众号后台回复"学习",获取作 ...

  9. java手写一个分页的方法_java web手写实现分页功能

    现在很多流行的框架,都可以很快的把分页效果做出来,但是作为一名程序员你必须得知道手写分页的流程: 场景效果: 一.分页的思路 首先我们得知道写分页代码的思路,保持思路清晰,才能行云流水的去写代码,其实 ...

最新文章

  1. Oracle中的iot_type,oracle IOT表学习
  2. STM8单片机串口驱动的深度解析
  3. mxnet常规优化器用法
  4. 一定要用虚拟化服务器吗?
  5. NGINX 配置404错误页面转向
  6. 基于元组,根据月份,计算天数.(Python)
  7. Cobub无码埋点关键技术的实现
  8. java –cp ./:_成为Java流专家–第2部分:中级操作
  9. mongodb教程_MongoDB教程
  10. 我的世界电脑正版服务器地址大全,我的世界服务器地址有哪些_服务器地址大全_3DM网游...
  11. 护眼色RGB值和HSV值
  12. 进制转换C语言实现(十进制转换为任意进制)
  13. 平板/笔记本亮度调节工具halo(WINDOWS)
  14. 学 C++ ,能不能简单点?
  15. 新晋小王子 doodoo.js Node.js开发框架
  16. MapReduce论文笔记
  17. 基于android的快递寄件平台
  18. creo管道设计教程_Pro/E Pro/PIPING 管道设计教程|就上UG网
  19. 南昌理工学院计算机科学与技术排名,南昌理工学院排名2018年下滑5名 在民办大学中实力排全国第38名...
  20. 软工网络16个人作业一

热门文章

  1. java中堆和堆栈的区别
  2. 惠普暗影精灵命令中心linux,暗影精灵2成功装上Sierra 12.5正式版
  3. ElementUI表格吸顶(sticky)
  4. MATLAB读取网页内链接,Matlab使用urlread()读取网页乱码问题
  5. MySQL第三方客户端工具
  6. Winows通过非445端口远程访问公网Samba
  7. 层(Overlays)
  8. IDEA中jpg文件或png文件显示乱码处理方法
  9. 双向可控硅漏电流 ?- 解决方法
  10. CS_2023_01