`
Aguo
  • 浏览: 33196 次
  • 性别: 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
分享到:
评论

相关推荐

    json-lib-2.4-jdk15-sources.jar

    总的来说,`json-lib-2.4-jdk15-sources.jar`为开发者提供了一个强大的工具,不仅能够方便地处理JSON数据,还通过源码开放了学习和定制的空间,对于提升Java Web开发技能大有裨益。通过研究这个库,我们可以更好地...

    json-lib源码放出

    通过深入研究`json-lib`的源码,你可以了解JSON与Java对象之间的转换机制,学习如何优化性能,以及如何处理数据序列化和反序列化的异常情况。这对于提升你的Java编程技能,尤其是处理JSON数据的能力大有裨益。同时,...

    关于Json-lib对日期型的转换解决方法

    通过自定义日期处理器,我们可以确保日期数据以期望的格式在JSON中传输,避免因格式不一致导致的问题。对于大型项目而言,这种定制化的能力尤为关键,因为它可以帮助维护数据的一致性和可读性。

    json解析的几个工具包好gson,jackson,json_lib

    json-lib提供了多种语言(如JavaScript、Python、Ruby)的JSON转换方法,并且可以将Java集合、Map、Date等类型转换为JSON。然而,json-lib相比Gson和Jackson可能在性能和更新频率上稍逊一筹。 这些库的使用通常需要...

    JSON LIB转化时间

    3. **自定义日期格式**:如果JSON中的日期格式与默认格式不同,我们需要自定义日期解析逻辑,确保正确转换。 4. **错误处理**:在处理日期时,可能会遇到解析异常或格式不匹配的问题,需要进行适当的错误处理,避免...

    json例子源码

    fastjson gson jackjson json-lib org.json的使用例子 package ivyy.taobao.com.utils; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import ...

    利用反射机制对象转JSON

    利用Java的反射机制和json-lib包进行对象转JSON,包括set,list,object等,只需要对util类进行对应的配置即可。在对象转json的时候经常会出现对象持有set,list,date类型时会发生递归无限循环的情况,此代码完美...

    json所需jar包

    JSONLib还支持与各种Java集合和类型(如List、Map、Date等)的互操作。 2. **commons-collections-3.2.1.jar**: Apache Commons Collections是Apache软件基金会提供的一个Java集合框架扩展,包含大量实用工具类和...

    Flex3中用到的工具类包,含有json类

    Flex3是Adobe开发的一款用于构建富互联网应用(RIA)的框架,它基于ActionScript 3.0编程语言和Flash Player运行...通过深入研究源码,可以更好地理解JSON在ActionScript中的工作原理,并提升你在Flex开发中的能力。

    Date-Calc-5.4.tar.gz_Date-Calc-5.4

    标题中的"Date-Calc-5.4.tar.gz_Date-Calc-5.4"指的是一个名为"Date-Calc"的Perl模块的版本5.4的压缩文件,它采用tar.gz格式进行打包。这种格式通常用于在Unix/Linux环境中归档和压缩文件,方便传输和存储。".tar"是...

    Extjs中文教程

    - 当内置的格式化方法不足以满足需求时,可以通过自定义函数来扩展`Ext.util.Format`。 - 或者直接在XTemplate中编写更复杂的逻辑。 #### 七、Extjs组件结构 - **Extjs的组件结构远比我们想象的复杂** - 组件是...

    Elasticsearch数据库下载、配置、使用案例&amp;简单的项目源码.pdf

    path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 0.0.0.0 http.port: 9200 ``` #### 启动Elasticsearch - **系统服务启动**: ```bash sudo systemctl start elasticsearch ...

    ICS delphixe10源码版

    .\Lib Unit output directories for all package builds, subdirectories | for 2007+ will be created on building the packages \$(Config) Release / Debug | \$(Platform) Win32 / Win64 / OSX32 | \...

    开源企业搜索引擎SOLR的 应用教程

    用户可以通过修改Solrhome下的配置文件来调整Solr的行为。 - **1.4.3 solr的各包的说明** Solr的主要包包括: - `org.apache.solr.core`:核心组件,如SolrCore。 - `org.apache.solr.update`:索引更新相关的...

    jdk-8u261-windows-x64.rar

    此外,对于企业级应用,JDK 8还引入了新的Date和Time API,改进了并发处理,以及增强了JSON支持。 在安装和使用JDK时,开发者需要设置环境变量`JAVA_HOME`指向JDK的安装路径,并将`bin`目录添加到系统PATH中,以...

Global site tag (gtag.js) - Google Analytics