使用原始的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字符串格式就可以通过我们自定义了。
分享到:
相关推荐
总的来说,`json-lib-2.4-jdk15-sources.jar`为开发者提供了一个强大的工具,不仅能够方便地处理JSON数据,还通过源码开放了学习和定制的空间,对于提升Java Web开发技能大有裨益。通过研究这个库,我们可以更好地...
通过深入研究`json-lib`的源码,你可以了解JSON与Java对象之间的转换机制,学习如何优化性能,以及如何处理数据序列化和反序列化的异常情况。这对于提升你的Java编程技能,尤其是处理JSON数据的能力大有裨益。同时,...
通过自定义日期处理器,我们可以确保日期数据以期望的格式在JSON中传输,避免因格式不一致导致的问题。对于大型项目而言,这种定制化的能力尤为关键,因为它可以帮助维护数据的一致性和可读性。
json-lib提供了多种语言(如JavaScript、Python、Ruby)的JSON转换方法,并且可以将Java集合、Map、Date等类型转换为JSON。然而,json-lib相比Gson和Jackson可能在性能和更新频率上稍逊一筹。 这些库的使用通常需要...
3. **自定义日期格式**:如果JSON中的日期格式与默认格式不同,我们需要自定义日期解析逻辑,确保正确转换。 4. **错误处理**:在处理日期时,可能会遇到解析异常或格式不匹配的问题,需要进行适当的错误处理,避免...
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 ...
利用Java的反射机制和json-lib包进行对象转JSON,包括set,list,object等,只需要对util类进行对应的配置即可。在对象转json的时候经常会出现对象持有set,list,date类型时会发生递归无限循环的情况,此代码完美...
JSONLib还支持与各种Java集合和类型(如List、Map、Date等)的互操作。 2. **commons-collections-3.2.1.jar**: Apache Commons Collections是Apache软件基金会提供的一个Java集合框架扩展,包含大量实用工具类和...
Flex3是Adobe开发的一款用于构建富互联网应用(RIA)的框架,它基于ActionScript 3.0编程语言和Flash Player运行...通过深入研究源码,可以更好地理解JSON在ActionScript中的工作原理,并提升你在Flex开发中的能力。
标题中的"Date-Calc-5.4.tar.gz_Date-Calc-5.4"指的是一个名为"Date-Calc"的Perl模块的版本5.4的压缩文件,它采用tar.gz格式进行打包。这种格式通常用于在Unix/Linux环境中归档和压缩文件,方便传输和存储。".tar"是...
- 当内置的格式化方法不足以满足需求时,可以通过自定义函数来扩展`Ext.util.Format`。 - 或者直接在XTemplate中编写更复杂的逻辑。 #### 七、Extjs组件结构 - **Extjs的组件结构远比我们想象的复杂** - 组件是...
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 ...
.\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 | \...
用户可以通过修改Solrhome下的配置文件来调整Solr的行为。 - **1.4.3 solr的各包的说明** Solr的主要包包括: - `org.apache.solr.core`:核心组件,如SolrCore。 - `org.apache.solr.update`:索引更新相关的...
此外,对于企业级应用,JDK 8还引入了新的Date和Time API,改进了并发处理,以及增强了JSON支持。 在安装和使用JDK时,开发者需要设置环境变量`JAVA_HOME`指向JDK的安装路径,并将`bin`目录添加到系统PATH中,以...