使用原始的json-lib处理java中的Date,返回的json字符串是这样的:
A::: "birthday":{"date":27,"day":0,"hours":10,"minutes":22,"month":8,"seconds":11,"time":1254018131312,"timezoneOffset":-480,"year":109}
而在系统页面上显示的日期格式一般是:yyyy-MM-dd 之类的格式。在前台用js处理以上字符串是比较麻烦的。我们的目标是通过修改json-lib的源码以配置的方式可以自定义Date的json格式!
比如:
B::: "birthday":"2009-09-27 10:29:55" ,,"birthday":"2009-09-27"
本文并不是讨论json-lib的实现原理,有兴趣的读者可以自己研究一下。
1.下载json-lib的源码包,新建java工程,将源码放到src目录下。会出现很多红XX,需要其他jar包,看需要什么就加什么上去吧。
2.新建测试类
public class Person {
private String username;
private String password;
private Date birthday;
// getter setter
3.测试用例
import java.util.Date;
import net.sf.json.JSONObject;
/**
* 测试用例
* @author HalZhang
*
*/
public class JsonTest {
public static void main(String[] args) {
Person person = new Person();
person.setUsername("halzhang");
person.setBirthday(new Date());
JSONObject object = JSONObject.fromObject(person);
System.out.println(object.toString());
}
}
使用默认的json-lib,birthday输出的json格式是A
通过debug跟踪发现json-lib将对象转换为json字符串主要是在JSONObject这个类完成的,所以我们主要是对这个类做一些修改
1. 添加:
private static String DATEFORMAT = "yyyy-MM-dd";//定义Date默认的JSON格式
private final static String DATEFORMAT_KEY = "dateformat";
/**
* 是否格式化Date<br>
* 方便自定义需求
*/
private static boolean IFFORMATDATE = false;
private final static String IFFORMATDATE_KEY = "ifFormatDate";
//静态方法加载配置文件
static {
Properties properties = new Properties();
try {
InputStream is = JSONObject.class.getClassLoader().getResourceAsStream("dateformat.properties");
properties.load(is);
DATEFORMAT = properties.getProperty(DATEFORMAT_KEY);
if(properties.containsKey(IFFORMATDATE_KEY)){
IFFORMATDATE = Boolean.parseBoolean(properties.getProperty(IFFORMATDATE_KEY));
}
} catch (FileNotFoundException e) {
System.out.println("系统找不到dateformat.properties配置文件,Date类型对象转换成JSON使用默认的格式:"+DATEFORMAT);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Creates a JSONObject.<br>
* 并设置日期显示格式
* @param object
* @param dateFormat
* @return
*/
public static JSONObject fromObject(Object object,String dateFormat){
JSONObject.DATEFORMAT = dateFormat;
return fromObject(object, new JsonConfig());
}
/**
* 构造器,方便动态定义日期显示格式
* @param dateformat 日期显示格式
*/
public JSONObject(String dateformat){
this();
JSONObject.DATEFORMAT = dateformat;
}
2.修改setValue方法
private static void setValue( JSONObject jsonObject, String key, Object value, Class type,
JsonConfig jsonConfig, boolean bypass ) {
boolean accumulated = false;
if( value == null ){
value = jsonConfig.findDefaultValueProcessor( type )
.getDefaultValue( type );
if( !JsonVerifier.isValidJsonValue( value ) ){
throw new JSONException( "Value is not a valid JSON value. " + value );
}
}
if( jsonObject.properties.containsKey( key ) ){
if( String.class.isAssignableFrom( type ) ){
Object o = jsonObject.opt( key );
if( o instanceof JSONArray ){
((JSONArray) o).addString( (String) value );
}else{
jsonObject.properties.put( key, new JSONArray().element( o )
.addString( (String) value ) );
}
}else{
jsonObject.accumulate( key, value, jsonConfig );
}
accumulated = true;
}else{
if (bypass || String.class.isAssignableFrom(type)) {
jsonObject.properties.put(key, value);
} else if (Date.class.isAssignableFrom(type) && IFFORMATDATE) {
//当属性类型为Date,并且需要进行格式化的时候,将Date转化为我们定义的日期格式
SimpleDateFormat format = new SimpleDateFormat(DATEFORMAT);
jsonObject.properties.put(key, format.format(value));
} else {
jsonObject.setInternal(key, value, jsonConfig);
}
}
value = jsonObject.opt( key );
if( accumulated ){
JSONArray array = (JSONArray) value;
value = array.get( array.size() - 1 );
}
firePropertySetEvent( key, value, accumulated, jsonConfig );
}
3.配置文件 dateformat.properties 放在src目录下面
#Created by JInto - www.guh-software.de #Mon Aug 31 15:25:06 GMT 2009 #"yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT #"EEE, MMM d, ''yy" Wed, Jul 4, '01 #"h:mm a" 12:08 PM #"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time #"K:mm a, z" 0:08 PM, PDT #"yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM #"EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700 #"yyMMddHHmmssZ" 010704120856-0700 #"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 2001-07-04T12:08:56.235-0700 dateformat=yyyy-MM-dd # true = you want to use the dateformat to format the java.Util.Date ifFormatDate=true
通过以上修改配置,Date的json字符串格式就可以通过我们自定义了。