从零手动实现 java json 序列化框架
json
json 是 java 实现的序列化 json 框架。
特性
-
8 大基本类型支持
-
基本类型/对象数组/集合/枚举/对象 支持
- 极简的 API
后续特性
-
@Field 注解的支持
- 反序列化对象的完整性支持,目前只支持基础的反序列化。
为何创作
- 解决 fastJson 中的不足
FastJSON 在序列化本身存在一定限制。当对象中有集合,集合中还是对象时,结果不尽如人意。
- 轻量且高效
FastJson 等 json 工具特性丰富,但是考虑过多,也兼容过多。
希望通过严格控制序列化和反序列,从而使得代码变得高效轻量,更加适合自己的使用场景,
- 后续拓展
后续序列化相关,将使用这个工具实现,方便自行拓展学习。
变更日志
变更日志
快速开始
环境依赖
JDK 1.7+
Maven 3.X
maven 依赖
[XML] 纯文本查看 复制代码
1
2
3
4
5
|
< dependency >
< groupId >com.github.houbb</ groupId >
< artifactId >json</ artifactId >
< version >最新版本</ version >
</ dependency >
|
基本例子
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
import JsonBs;
import org.junit.Assert;
import org.junit.Test;
/**
* null 测试
* @author binbin.hou
* @since 0.0.1
*/
public class NullTest {
@Test
public void nullTest() {
final String string = null ;
Assert.assertEquals( "null" , JsonBs.serialize(string));
final String result = JsonBs.deserialize( "null" , String. class );
Assert.assertNull(result);
}
}
|
测试案例
以下演示所有测试代码见
test 模块
字符串和 char 测试案例
字符串
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
@Test
[/b]
[b] public void commonTest() {
final String string = "123" ;
Assert.assertEquals( "\"123\"" , JsonBs.serialize(string));
final String json = "\"123\"" ;
Assert.assertEquals(string, JsonBs.deserialize(json, String. class ));
}
@Test
public void escapeTest() {
final String string = "\"123" ;
Assert.assertEquals( "\"\"123\"" , JsonBs.serialize(string));
final String json = "\"123\"" ;
Assert.assertEquals( "123" , JsonBs.deserialize(json, String. class ));
}
|
char 类型
[Java] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
|
@Test
public void escapeTest() {
char c = '\'' ;
final String json = "\"'\"" ;
Assert.assertEquals(json, JsonBs.serialize(c));
assert c == JsonBs.deserialize(json, char . class );
}
|
对于数组的支持字符串
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
@Test
public void stringEmptyTest() {
String[] strings = new String[]{};
String json = "[]" ;
Assert.assertEquals(json, JsonBs.serialize(strings));
Assert.assertEquals(strings, JsonBs.deserialize(json, String[]. class ));
}
@Test
public void stringTest() {
String[] strings = new String[]{ "a" , "b" , "c" };
final String json = "[\"a\",\"b\",\"c\"]" ;
Assert.assertEquals(json, JsonBs.serialize(strings));
Assert.assertEquals(strings, JsonBs.deserialize(json, String[]. class ));
}
|
基本类型测试
[Java] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
|
public void intTest() {
int [] ints = new int []{ 1 , 2 , 3 };
final String intJson = "[1,2,3]" ;
Assert.assertEquals(intJson, JsonBs.serialize(ints));
//[1, 2, 3]
System.out.println(Arrays.toString(JsonBs.deserialize(intJson, int []. class )));
}
|
基本对象类型测试
[Java] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
|
public void integerTest() {
Integer[] ints = new Integer[]{ 1 , 2 , 3 };
final String json = "[1,2,3]" ;
Assert.assertEquals(json, JsonBs.serialize(ints));
//[1, 2, 3]
System.out.println(Arrays.toString(JsonBs.deserialize(json, Integer[]. class )));
}
|
集合字符串列表测试
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
|
public void stringTest() {
[/font][/backcolor][/color]
[color=# 001000 ][backcolor=rgb( 242 , 245 , 249 )][font=Consolas,] List<String> strings = new ArrayList<>();
strings.add( "10" );
strings.add( "20" );
strings.add( "30" );
Class clazz = strings.getClass();
final String json = "[\"10\",\"20\",\"30\"]" ;
Assert.assertEquals(json, JsonBs.serialize(strings));
Assert.assertEquals(strings, JsonBs.deserialize(json, clazz));
}
|
字符串 Map 测试
[Java] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
|
public void stringTest() {
Map<String, String> map = new HashMap<>();
map.put( "123" , "456" );
final String json = "{\"123\":\"456\"}" ;
Assert.assertEquals(json, JsonBs.serialize(map));
Assert.assertEquals(map, JsonBs.deserialize(json, map.getClass()));
}
|
对象基础对象
演示
- User.java
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
public class User {
private String name;
private int age;
private double score;
private char sex;
private Date birthday;
//Getter & Setter
//ToString()
}
|
测试代码
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
|
public void userTest() {
User user = new User();
user.age( 10 ).name( "wiki" ).birthday( new Date(1568196960491L)).score( 123 .d).sex( 'g' );
final String json = "{\"name\":\"wiki\",\"age\":10,\"score\":123.0,\"sex\":\"g\",\"birthday\":1568196960491}" ;
Assert.assertEquals(json, JsonBs.serialize(user));
User user2 = JsonBs.deserialize(json, User. class );
Assert.assertEquals(user.toString(), user2.toString());
}
|