Skip to content
/ json Public

Java类库学习——实现json序列化/解析库。主要技术:antlr框架

License

Notifications You must be signed in to change notification settings

xcr1234/json

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

#Java 开源JSON库 - XSON

目前有很多可靠的json库,例如gson、org.json、fastjson;但是还是自己实现了一下一套完整的json流程。(之前也实现过,现在属于重构)

下载:xson1.2.zip

在Maven中构建

<dependency>
  <groupId>io.github.xcr1234</groupId>
  <artifactId>xson</artifactId>
  <version>1.2</version>
</dependency>

TODO:
期望做一个Json Path的功能,奈何能力有限!各位大神欢迎fork我的代码,为xson添砖加瓦吧!

##主要原理: 基于antlr框架提供的强大的词法分析和语法分析功能,书写json的文法、Listener监听器;通过antlr执行。
整个流程为
String/InputStream -> Lexer -> Parser -> Tree
Walker- >Tree -> JsonObject/JsonArray

JsonObject的底层其实就是一个Map<String,Object>(默认实现为LinkedHashMap);
JsonArray的底层就是一个List<Object>(默认为ArrayList<Object>)。

##主要方法:

xson框架的入口类是com.xson.Json,并提供了两个非常实用的类JsonObject、JsonArray。

序列化:

String json = Json.toJsonString(object);

如果一个java bean对象要被json序列化,它必须实现JsonAware、JsonObjectAware、JsonArrayAware接口任意之一, JsonObjectAware、JsonArrayAware接口相当于是JsonAware的一个扩展。

反序列化: 如果一个java bean对象要被json库反序列化,那么它应该实现JsonBeanAware接口。

JsonObject jsonObject = Json.parseObject("...");
JsonArray jsonArray = Json.parseArray("...");

VO vo = Json.parseBean("...",VO.class);
List<VO> voList = Json.parseBeanList("...",VO.class);

JsonObject/JsonArray的类型转化

JsonObjectJsonArray类的getXXX方法支持自动类型转换,例如put时的value类型是int,在调用getString方法时会自动将int转换为String。

例子:

jsonObject.put("num",100);
String str = jsonObject.getString("num"); //自动将int转换为String,结果为"100"
String str2 = (String)jsonObject.get("num");  //强制转换失败,抛出ClassCastException

jsonObject.put("str","100");
int num = jsonObject.getInt("str"); //自动转换为数字100.

如果自动转换也失败了,则会抛出JsonCastException

Java Bean对象的例子

class Bean implements JsonObjectAware,JsonBeanAware{
	private int id;
	private String name;
	
	// ...
	// 省略get set 方法
	
	@Override
    public void toJson(JsonObject jsonObject, SerializeFeature feature) {
		//将bean对象的所有属性注入到JsonObject当中。
		jsonObject.put("id",id);
		jsonObject.put("name",name);
	}
	
	@Override
    public void parse(JsonObject jsonObject, DeserializeFeature feature) {
		//从JsonObject中读取出这个类的所有属性。
		this.id = jsonObject.getInt("id");
		this.name = jsonObject.getString("name");
	}
	
}

如何定制序列化

XSON库默认不输出value=null的key,如果需要输出的话,需要设置writesNullValue为true

Json类所有的方法后面都支持feature参数,例如

Json.toJsonString(object,serializeFeature);`
JsonObject jsonObject = Json.parseObject("...",deSerializeFeature);

默认的feature实现分别是DefaultSerializeFeatureDefaultDeserializeFeature,您有两种方式修改序列化/反序列化配置。

方式一,调用DefaultSerializeFeature的各种set方法:

DefaultSerializeFeature serializeFeature = new DefaultSerializeFeature();
serializeFeature.setWriteCollectionAsJson(false);   //是否将集合类型转为JsonArray输出
serializeFeaturesetWritesNullValue(true);   //是否输出value为null的key.

方式二:重写DefaultSerializeFeature的接口方法。

SerializeFeature serializeFeature = new DefaultSerializeFeature(){
            @Override
            public boolean writeCollectionAsJson() {
                return false;
            }

            @Override
            public boolean writesNullValue() {
                return true;
            }
        };

全局默认配置

DefaultSerializeFeature.globalDefaultFutureDefaultDeserializeFeature.globalDefaultDeserializeFeature

实现自己的JsonObject

JsonObject默认使用LinkedHashMap来保证json key的顺序,如果对顺序没有强制的要求,这样,我们可以使用HashMap来提高性能。
你也可以自己提供其他的Map实现。

方式是继承JsonObject类,覆盖protected Map<String, Object> createMap()protected Map<String, Object> createMap(Map<String, Object> map)方法。

public class MyJsonObject extends JsonObject {
	@override
	protected Map<String, Object> createMap(){
		return new HashMap<String, Object>();
	}
	@override
	protected Map<String, Object> createMap(Map<String, Object> map){
		return new HashMap<String, Object>(map);
	}
}
JsonObject jsonObject = new MyJsonObject();

同样地,JsonArray类也支持类似的实现。

例子

更多例子请参考:例子


参考文档

The Definitive ANTLR 4 Reference, 2nd Edition

使用 Antlr 开发领域语言

About

Java类库学习——实现json序列化/解析库。主要技术:antlr框架

Resources

License

Stars

Watchers

Forks

Packages

No packages published