1 Star 0 Fork 17

joylei / beetl-json

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

Beetl-JsonTool 作为beetl模板引擎的一个附属工具,提供了对象序列化成json技术。其原理是基于(Location:action)*,功能强大,扩展性强,而体积小,仅仅不到60K。

##例子:

  • name:i 忽略name属性

  • id:i,obj.id:i 忽略属性id,忽略属性obj对象的id的属性.可以将多个序列化策略组合在一起,用逗号分开

  • d:f/yyyy-MM-dd/ 这个对象实例的日期类型格式化输出,符号代表这个实例

  • ~c:?emtpy->[],这个实例集合为null或者为空都输出[],->后可以是任何常量

  • name:nn/myName/ 将属性name输出成myName

  • ~*:o/name, age/ 这个对象实例排序输出,name,age 先输出,其他按照定义输出

  • [1].date:f/yyyy-MM-dd/ 列表第二项目的date属性格式化输出

  • api 例子如下

      String json = JsonTool.serialize(user);	
      //排序	
      String json1 = JsonTool.serialize(user,"~*:o/age,name/"));	
      //忽略第二个元素
      String json2 = JsonTool.serialize(list,"[1]:i"));

##Location 定义了一个序列化的位置,比如最简单的location就是属性名称,或者是属性类型,如

  • nane:nn/myName/ 遇到name属性,输出的是myName,nn是action指示,表示New Name
  • ~ 代表当前实例:
    • ~d 遇到类型为日期的,格式化输出。d是Java.Util.Date的简称。
    • ~n 表示一个number类型
    • ,也可以忽略包名,JsonTool会根据配置自动找类(JsonTool.addImportPkg()),如果具体类名后有×,表示其子类也匹配
    • ~c 表示是一个集合
    • ~d 表示一个日期
  • *:表示当前实例,如*:o/age,name/,当前实例的属性,按照age,name先后顺序输出,其他保持不变
  • L 表示后面是个具体类,如L/java.util.Date/:f/yyyy-MM-dd/ 所有类型为Date的都进行格式,注意~L 同 ~* 不一样,前者表示序列化当前实例或者之后的任何对象,只要碰到 L 指定的类,都将采用指定的序列化策略,而* 表示的是当前的对象实例。

locaton 可以是属性表达式

  • obj.aaa.xx,指属性obj的属性aa的属性xx的位置
  • obj[1].name ,指属性obj是个集合,位置是第二元素的name属性。
  • obj[*].name ,指属性obj是个集合,位置是所有元素。
  • ["key"].name ,指map的key项。
  • obj.aaa.* .指属性obj的属性aa,如obj.aaa.*:i/users,orgs/

注意,不支持[1][2]这种连续方式

##Action 定义了一个匹配动作的输出,有以下几种

  • i:表示忽略,如name:i 遇到name属性,忽略. ~*:i/age,bir/ 忽略类的属性age,bir,[1]:i 表示忽略第2项,[name]:i 表示忽略key为name的项
  • o:表示排序,如~*:o/name, age/ 。name和age属性总是排在最前面.其他属性按顺序排(内置的AttributeComparator完成属性排序,原始类型排在最前,其次是pojo类型,再次是java类型,最后是集合类型)
  • u:表示使用类的属性,如~*:u/name,age,bir/。 其他属性忽略
  • cu:出现循环引用,仅仅显示参数指定的字段,如{~L/Department/*:ci/name,id/} ,对于Department类,如果被重复引用,则只显示name和id,其他字段不显示。
  • ci:出现循环引用,不显示参数指定的字段,如{~L/Department/*:ci/users/} ,对于Department类,如果被重复引用,则不显示users字段。
  • nn 表示更改名字,{nane:nn/myName/} 将输出myName
  • ? 代表一个if,如果满足条件,则指定一个输出,如xxList:?null->[],如果某集合xxList 为null,则输出一个[] ,?后年可以指定null,empty,以及某个数字。->表示输出
  • $.xxx,用于调用当前位置对象的某个方法,如{ts:$.get},并不是输出ts,而是输出ts.get(). 调用后,可以使用->在使用一个Action,比如: "~L/java.util.Calendar*/:$.getTime->f/yyyy-MM-dd/" 遇到Calendar和其子类,先获取Date类型,然后格式化
  • f 用于格式化输出,如number:f/#.##/,也可以自定义格式化函数并注册,比如注册一个格式化函数Money, 则number:fMoney 则会调用money做输出
  • -> 直接输出 ,比如 name:->unkown.

##API例子:

//全局设定,对于所有对象都适用
JsonTool.addLocationAction("~d","f/yyyy.MM.dd/");	
JsonTool.addLocationAction("~L/java.util.Calendar*/","$.getTime->f/yyyy-MM-dd/");
//类json格式的策略,用逗号分开多个locationAction
JsonTool.addPolicy("~f:f/#.##/,~c:?null->[]");
// 默认是紧凑输出,使用true,将换行和缩进	
JsonTool.pretty = true;
//序列化User
String json = JsonTool.serialize(User);
//or  指定一个序列化策略,age,name先输出,适合有特殊需求的对象或者无法注解(第三方)对象
String json2 = JsonTool.serialize(User,"~*:o/age,name/"));
// 同上策略,但name属性输出改为code
String json2 = JsonTool.serialize(User,"~*:o/age,name/,name:nn/code/"));
// 同上策略,像api传递俩个策略
String json2 = JsonTool.serialize(User,"~*:o/age,name/","name:nn/code/"));
//序列化dept,Department跟SysUser是一对多关系,如果俩个类都重复引用,则忽略导致重复引用的dept字段和users字段
String json1 = JsonTool.serialize(dept, "~L/SysUser/:ci/dept/,~L/Department/:ci/users/");

注解

默认情况下,也可以用注解来作为序列化策略。

@Json(
	policys={
			@JsonPolicy(location="name", action="nn/newUserName/"),
			@JsonPolicy(location="deleteList", action="?empty->[]")						
	}
)
public class User{	
	String name="joel";
	int age =12;	
	double salary=12.32266;
	Customer  customer = new Customer();
	List<Customer>  list = new ArrayList<Customer>();
	List<Customer>  deleteList = null;
	//getter and setter 	方法必须有,在此忽略
}



@Json(
	policys={
			@JsonPolicy(location="name", action="nn/userName/")			
	}
)
class Customer{
	String name="lijz";
	int age=11;
	Date bir = new Date();
	//getter and setter 	方法必须有,在此忽略
}

主要api:

  • JsonTool.addLocationAction(String loc,String action) :增加一个全局的序列化策略,如JsonTool.addLocationAction("~d","f/yyyy.MM.dd/");
  • JsonTool.pretty:默认是紧凑输出,改为true,则有缩进和换行
  • JsonTool.serialize(Object o) :序列化对象,返回String
  • JsonTool.serialize(Object o,Writer w) :序列化对象到Writer里
  • JsonTool.serialize(Object o,String policy) :序列化对象,返回String,并使用额外的序列化策略
  • JsonTool.serialize(Object o,String... policy) :序列化对象,使用多个序列化策略
  • JsonTool.serialize(Object o,Writer w,String policy) :序列化对象到Writer里,并使用额外的序列化策略
  • JsonTool.serialize(Object o,Writer w,String... policy) :序列化对象到Writer里,使用多个序列化策略

更多例子参考单元测试代码 https://git.oschina.net/xiandafu/beetl-json/tree/master/test

下一步:

  • spring集成,nutz,jfinal集成*
  • 性能优化,争取前三
  • 反序列化,总体大小不超过100k。

空文件

简介

json序列化另外一种实现方式 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/wowin/beetl-json.git
git@gitee.com:wowin/beetl-json.git
wowin
beetl-json
beetl-json
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891