#Java 开源JSON库 - XSON
目前有很多可靠的json库,例如gson、org.json、fastjson;但是还是自己实现了一下一套完整的json流程。(之前也实现过,现在属于重构)
在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
类的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
。
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实现分别是DefaultSerializeFeature
和DefaultDeserializeFeature
,您有两种方式修改序列化/反序列化配置。
方式一,调用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.globalDefaultFuture
和DefaultDeserializeFeature.globalDefaultDeserializeFeature
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
类也支持类似的实现。
更多例子请参考:例子
参考文档