简单易懂的JSON框架
分享一个由本人编写的JSON框架。
JSON反序列化使用递归方式来解析JSON字符串,不使用任何第三方JAR包,只使用JAVA的反射来创建对象(必须要有无参构造器),赋值,编写反射缓存来提升性能。支持复杂的泛型类型,数组类型等所有类型。(不支持高版本JDK1.8以上的日期类型,如LocalDate,LocalDateTime,需要你修改源码JsonString类来支持)
你可以改造源码,让其支持注解序列化和反序列化。扩展一些功能,如JsonPath路径方式解析。当然前提是你感兴趣和有一定的封装能力的话。。。
下面是使用案例:
package test; import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.List;
import java.util.Map; import june.zero.generic.TypeBuilder;
import june.zero.json.JSON; public class Main { public static class User {
public String name;
public int age;
public java.util.Date date;
public int[] hobbys;
public String jsonObjectData;
public String jsonArrayData;
} public static class Response<T> {
public int code;
public String message;
public T data;
} public static void main(String[] args) {
// //支持单引号和没有空格名称
// //String json = "{\"name\":\"张三\",\"age\":33}";//标准JSON格式
// //String json = "{'name':'张三','age':33}";//单引号的格式
// //String json = "{name:张三,age:33}";//没有空格名称的格式,不建议使用
String json = "{'name':'张三','age':33,'date':'2024-06-06 12:12:12','hobbys':[1,2,3],'jsonObjectData':{'a':1,'b':2},'jsonArrayData':['a','b','c']}";
User user = JSON.fromJSON(json, User.class);
System.out.println(user.name);//张三
System.out.println(user.age);//33
System.out.println(user.date);//2024-06-06 12:12:12.0
System.out.println(Arrays.toString(user.hobbys));//[1, 2, 3]
//json对象以String存储起来
System.out.println(user.jsonObjectData);//{'a':1,'b':2}
//json数组以String存储起来
System.out.println(user.jsonArrayData);//['a','b','c'] String json2 = "{'code':1,'message':'查询成功','data':[{'name':'李四','age':44},{'name':'王五','age':55}]}";
System.out.println("=====1======");
Type listUserType = new TypeBuilder<Response<List<User>>>() {}.getGenericType();
System.out.println(listUserType);//test.Main.test.Main$Response<java.util.List<test.Main$User>>
Response<List<User>> response1 = JSON.fromJSON(json2, listUserType);
System.out.println(response1.data.get(1).name);//王五 System.out.println("=====2======");
Type listMapType = new TypeBuilder<Response<List<Map<String,Object>>>>() {}.getGenericType();
System.out.println(listMapType);//test.Main.test.Main$Response<java.util.List<java.util.Map<java.lang.String, java.lang.Object>>>
Response<List<Map<String,Object>>> response2 = JSON.fromJSON(json2, listMapType);
System.out.println(response2.data.get(1).get("name"));//王五 System.out.println("=====3======");
Type stringType = new TypeBuilder<Response<String>>() {}.getGenericType();
System.out.println(stringType);//test.Main.test.Main$Response<java.lang.String>
Response<String> response3 = JSON.fromJSON(json2, stringType);
System.out.println(response3.data);//[{'name':'李四','age':44},{'name':'王五','age':55}]
} }
开源不易,需要鼓励。使用请标明该来源。
因为可能长时间不会更新JAR包,所以我不建议你使用到真实开发环境。代码易懂,你可以自己维护和扩展功能。测试环境使用的是JDK1.7.0_80
源码:https://files.cnblogs.com/files/blogs/824473/Zjson-source.zip?t=1718154818&download=true
jar包:https://files.cnblogs.com/files/blogs/824473/ZJson.zip?t=1718154823&download=true
简单易懂的JSON框架的更多相关文章
- 开源 , KoobooJson一款高性能且轻量的JSON框架
KoobooJson - 更小更快的C# JSON序列化工具(基于表达式树构建) 在C#领域,有很多成熟的开源JSON框架,其中最著名且使用最多的是 Newtonsoft.Json ,然而因为版本迭代 ...
- 高性能JSON框架之FastJson的简单使用
1.前言 1.1.FastJson的介绍: JSON协议使用方便,越来越流行,JSON的处理器有很多,这里我介绍一下FastJson,FastJson是阿里的开源框架,被不少企业使用,是一个极其优秀的 ...
- Snack3 一个新的微型JSON框架
Snack3 一个新的微型JSON框架 一个作品,一般表达作者的一个想法.因为大家想法不同,所有作品会有区别.就做技术而言,因为有很多有区别的框架,所以大家可以选择的框架很丰富. snack3.基于j ...
- URL及日期等特殊数据格式处理-JSON框架Jackson精解第2篇
Jackson是Spring Boot默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制.它提供了很 ...
- 属性序列化自定义与字母表排序-JSON框架Jackson精解第3篇
Jackson是Spring Boot默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制.它提供了很 ...
- @JsonCreator自定义反序列化函数-JSON框架Jackson精解第5篇
Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...
- SpringBoot(2) Json框架 -- Jackson返回结果处理
一.常用框架 阿里 fastjson,谷歌gson等 JavaBean序列化为Json,性能:Jackson > FastJson > Gson > Json-lib 同个结构 Ja ...
- 小兔JS教程(五) 简单易懂的JSON入门
上一节的参考答案: http://xiaotublog.com/demo.html?path=homework/04/index2 本节重点来介绍一下JSON,JSON(JavaScript Obje ...
- 简单易懂的单元测试框架-gtest(一)
简介 gtest是google开源的一个单元测试框架,以其简单易学的特点被广泛使用.该框架以第三方库的方式插入被测代码中.同其他单元测试框架相似,gtest也通过制作测试样例来进行代码测试.同 ...
- 超轻量级Json框架SmartObject
最近我在codeplex上发了一个项目SmartObject(基于framework4.5,目前是1.0版本).用法如下: // HowToUse using Spider.Data; //json ...
随机推荐
- 二叉查找树的实现C/C++
二叉查找树是一种关键字有序存放的二叉树.在不含重复关键字的二叉查找树中,关键字"较小"的节点一定在关键字"较大"的节点的左子树中,"较小"一 ...
- 【ASPLOS 2022】机器学习访存密集计算编译优化框架AStitch,大幅提升任务执行效率
简介: 近日,关于机器学习访存密集计算编译优化框架的论文<AStitch: Enabling A New Multi-Dimensional Optimization Space for Mem ...
- 阿里云架构师梁旭:MES on 云盒,助力客户快速构建数字工厂
简介: 四大优势:一站式交付.业务低延时.数据本地驻留.多工厂统一运维 2022年5月18日,在"云上数字工厂与中小企业数字化转型创新论坛"暨"鼎捷MES & 阿 ...
- 实时计算pv/uv Demo
简介: 本文由阿里巴巴高级技术专家邓小勇(静行)分享,主要用 Demo 演示如何通过实时计算 Flink 实时计算pv/uv的场景. 本文由阿里巴巴高级技术专家邓小勇(静行)分享,主要用 Demo 演 ...
- [MySQL] 导入数据库和表的两种方式
如果是导入 mysqldump 导出的 sql 文件,使用 mysql 命令再导入就可以了. 下面是另一种可选方式: use xxdb source /var/lib/mysql/xxtable.sq ...
- Rust中的并发性:Sync 和 Send Traits
在并发的世界中,最常见的并发安全问题就是数据竞争,也就是两个线程同时对一个变量进行读写操作.但当你在 Safe Rust 中写出有数据竞争的代码时,编译器会直接拒绝编译.那么它是靠什么魔法做到的呢? ...
- 学会使用 NumPy:基础、随机、ufunc 和练习测试
NumPy NumPy 是一个用于处理数组的 Python 库.它代表"Numerical Python". 基本 随机 ufunc 通过测验测试学习 检验您对 NumPy 的掌握 ...
- MYSQL CONVERT、JSON_EXTRACT函数的使用总结
一.CONVERT.CONCAT.COUNT函数联合查询 CONVERT()函数用于将值从一种数据类型转换为表达式中指定的另一种数据类型. MySQL还允许它将指定的值从一个字符集转换为另一个字符集. ...
- 每天上一当系列之vue修饰符.number
今天使用number修饰符去处理el-input的内容为数字做校验原本以为省事不少,没想到,为0开头无法输入第二位以后,并且输入的比较多的时候会出现Infinity 很神奇,网上查了说是element ...
- 原生微信小程序
new Date 跨平台兼容性问题 在 Andriod 使用 new Date("2018-05-30 00:00:00")木有问题,但是在ios 下面识别不出来.因为 IOS 下 ...