简单易懂的JSON框架

json · 浏览次数 : 16

小编点评

{ "note": "这个JSON框架是一个简单的Java类结构,用于处理JSON数据。它使用递归解析JSON字符串,不依赖任何第三方库,并且只需要Java的反射机制。这个框架可以处理各种类型,包括复杂泛型、数组和List。但是,对于高版本的JDK1.8及以上日期类型(如LocalDate,LocalDateTime),需要修改源码JsonString类以支持。", "usage": "以下是一个使用示例: ```java import test.JsonHelper; public class Main { public static void main(String[] args) { 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 = JsonHelper.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] String json2 = "{\"code\":1,\"message\":\"查询成功\",\"data\":[{\"name\":\"李四\",\"age\":44},{\"name\":\"王五\",\"age\":55}]}"; Type listUserType = new TypeBuilder>>().getGenericType(); Response>> response1 = JsonHelper.fromJson(json2, listUserType); System.out.println(response1.data.get(1).name); // 王五 Type listMapType = new TypeBuilder>>.getGenericType(); Response>> response2 = JsonHelper.fromJson(json2, listMapType); System.out.println(response2.data.get(1).get("name")); // 王五 Type stringType = new TypeBuilder>().getGenericType(); Response> response3 = JsonHelper.fromJson(json2, stringType); System.out.println(response3.data); // [{"name\":\"李四\",\"age\":44},{"name\":\"王五\",\"age\":55}] } } ``` 这个JSON框架的核心是`JsonHelper`类,它提供了以下方法: - `fromJson(String json, Class clz)`:从JSON字符串解析出指定类型的对象。 - `fromJSON(String json, Type type)`:从JSON字符串解析出指定类型的对象,但不需要指定类。 - `toJson(T object)`:将对象转换成JSON字符串。 希望这个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框架相似的内容:

简单易懂的JSON框架

分享一个由本人编写的JSON框架。 JSON反序列化使用递归方式来解析JSON字符串,不使用任何第三方JAR包,只使用JAVA的反射来创建对象(必须要有无参构造器),赋值,编写反射缓存来提升性能。支持复杂的泛型类型,数组类型等所有类型。(不支持高版本JDK1.8以上的日期类型,如LocalDate,

如何优雅的写 css 代码

CSS(全称 Cascading Style Sheets,层叠样式表)为开发人员提供声明式的样式语言,是前端必备的技能之一,基于互联网上全面的资料和简单易懂的语法,CSS 非常易于学习,但其知识点广泛且分散,很难做到精通,在我们日常开发中,常常忽视了 CSS 代码的质量,很容易写出杂乱无章的 CS

探索计算机的I/O控制方式:了解DMA控制器的作用与优势

对于有科班背景的读者,可以跳过本系列文章。这些文章的主要目的是通过简单易懂的汇总,帮助非科班出身的读者理解底层知识,进一步了解为什么在面试中会涉及这些底层问题。否则,某些概念将始终无法理解。这些计算机基础文章将为你打通知识的任督二脉,祝你在编程领域中取得成功!

空闲空间管理和文件系统结构的优化策略

对于有科班背景的读者,可以跳过本系列文章。这些文章的主要目的是通过简单易懂的汇总,帮助非科班出身的读者理解底层知识,进一步了解为什么在面试中会涉及这些底层问题。否则,某些概念将始终无法理解。这些计算机基础文章将为你打通知识的任督二脉,祝你在编程领域中取得成功!

3种分页列表缓存方式,速收藏~

摘要:本文介绍了实现分页列表缓存的三种方式。 本文分享自华为云社区《分页列表缓存,你真的会吗》,作者: 勇哥java实战分享 。 1 直接缓存分页列表结果 显而易见,这是最简单易懂的方式。 我们按照不同的分页条件来缓存分页结果 ,伪代码如下: public List getPage

.Net性能测试工具BenchmarkDotNet学习

.Net性能测试工具BenchmarkDotNet学习 BenchmarkDotNet 是一个用于性能基准测试的开源框架。它可以让开发人员编写简单易懂的代码,并测量和分析这些代码的性能表现,从而帮助开发人员优化其代码,以达到更高的性能和更好的效率。 源码地址:https://github.com/d

[转帖]财富放大镜-资产证券化深度科普(上)

https://zhuanlan.zhihu.com/p/127043768 资产证券化,一听名字就是那种高大上的、复杂的、难理解的概念。别急,我们尽量用简单易懂的方式,来讲清楚它。 你可以简单的把资产证券化理解成是一种融资手段。 那些拥有资产的人,通常是那种大额的、短期内无法获得大量现金流的资产。

简单易懂,高效实用的接口文档编写技巧

接口文档是一个软件系统的重要组成部分,它描述了系统中所有可供外部应用程序使用的接口。简单来说,接口文档就是用来帮助开发者开发和对接系统的指南。在软件开发过程中,不同的系统之间需要进行数据交互和信息传递,这就要求系统必须提供一些公开的接口。

YiShaAdmin:一款基于.NET Core Web + Bootstrap的企业级快速开发框架

前言 今天大姚给大家分享一款基于.NET Core Web + Bootstrap的企业级快速后台开发框架、权限管理系统,代码简单易懂、界面简洁美观(基于MIT License开源,免费可商用):YiShaAdmin。 项目官方介绍 YiShaAdmin 基于.NET Core Web开发,借鉴了很

[转帖]怎么使用Docker部署openGauss国产数据库

https://www.yisu.com/zixun/742193.html 这篇文章主要介绍了怎么使用Docker部署openGauss国产数据库的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Docker部署openGauss国产数据库文章都会有所收获,下面我