`
Aguo
  • 浏览: 32642 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

通过修改json-lib源码自定义Date的json格式

    博客分类:
  • Ajax
阅读更多

使用原始的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字符串格式就可以通过我们自定义了。

0
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics