关于如何将含有Date类型属性的对象转换成符合实际应用的Json字符串

关于如何将含有Date类型属性的对象转换成符合实际应用的Json字符串

--即如何使用JsonConfig 以及 JsonValueProcessor接口实现

当我们将一个类实例转换成JSON字符串时 可以使用JSONObject 以及JSONArray两个常用的类进行转换。关于这两个类的使用方法这里就不作详述,有兴趣的初学者可以查看我的另外一篇关于JSON的文章:

地址:http://blog.csdn.net/lany1988/article/details/55188001

    如果是一个普通的类对象 里面没有特殊的属性 我们就可以简单的做个转换 实现类转JSON字符串,但是如果对象中有Date类型的成员 那我们就不能简单的进行转换了。

首先看看不做处理时,含有Date类型的对象会转成什么样的JSON字符串:

package miantest.jsontest;

import java.util.Date;

import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;

public class JsonDemoTest {
	private String a;
	private Date d;
	private Date[] ds;
	
	public JsonDemoTest() {
		super();
	}
	public JsonDemoTest(String a, Date d, Date[] ds) {
		super();
		this.a = a;
		this.d = d;
		this.ds = ds;
	}

	public String getA() {
		return a;
	}

	public void setA(String a) {
		this.a = a;
	}

	public Date getD() {
		return d;
	}

	public void setD(Date d) {
		this.d = d;
	}

	public Date[] getDs() {
		return ds;
	}

	public void setDs(Date[] ds) {
		this.ds = ds;
	}

	public static void main(String[] args) {
//		JsonConfig jsonConfig = new JsonConfig();
//		jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
		Date date = new Date();
		Date[] ds = new Date[2];
		ds[0] = new Date();
		ds[1] = new Date();

		JsonDemoTest jdt = new JsonDemoTest("aaa",date,ds);
		JSONObject jsonObject = JSONObject.fromObject(jdt);
		System.out.println(jsonObject.toString());
	}
}
如上面的代码 我们在面板输出后是这样子的:


很显然,我们想要的时间字符串以这种形式输出了,如果传给前台非常不好处理,如果能输出{d:2017-04-20}

类似这样的就非常好了。那我们该怎么做呢?其实很简单,我们只需要使用JsonConfig.class 这个类就好了。

我们将代码中的注释 放开(即如下这两句代码)

JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());

以及将 JSONObject jsonObject = JSONObject.fromObject(jdt); 这句代码写成:
    JSONObject jsonObject = JSONObject.fromObject(jdt,jsonConfig); 
    就搞定了,现在我开始简单解释下。
   JsonConfig.class 这个类从字面上来解释叫json的配置类,它的作用可不小,通过这个类我们可以对Json类的转换功能进行自定义,比如Date类型,如果不重新自定义就会输出年月日分开的形式,所以我们需要进行自定义,只要是Date类型的属性变量进行自定义输出,输出自己喜欢的样子。
第一步,我们先新建一个JsonConfig这个类对象JsonConfig jsonConfig = new JsonConfig();
第二步,调用jsonConfig这个对象的一个方法叫做 registerJsonValueProcessor(Class c,JsonValueProcessor o)
        jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
       这个方法需要两个参数:

1.第一个是你想要进行转换的属性类型,这里我想自定义Date类型的属性,所以填写Date.class
2.第二个是一个实现了JsonValueProcessor 这个接口的一个实现类,所以我们新建一个类 代码如下:

package miantest.jsontest;

import java.text.SimpleDateFormat;
import java.util.Date;

import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;

public class JsonDateValueProcessor implements JsonValueProcessor{//实现该接口
	
	private  String datePattern = "yyyy-MM-dd";//默认将Date转成的我们需要的样式
	
	public JsonDateValueProcessor() {
		super();
	}

	public JsonDateValueProcessor(String datePattern) {//这个构造方法的作用就是我们在创建对象还可以改变默认样式
		super();
		this.datePattern = datePattern;
	}


	public Object processArrayValue(Object value, JsonConfig jsonConfig) {//这里强调下 这里的value其实是数组里单个value值
		try {							   //所以这个方法的实现和下面那个一毛一样 你可以合并
			if(value instanceof Date){			//我之所以没合并是为了做实验 验证强调的点
				SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
				Date date = (Date)value;
				return sdf.format(date);
			}
			return value == null ? "" : value.toString();
		} catch (Exception e) {
			return "";
		}
//		return null;
	}

	public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
		try {
			if(value instanceof Date){
				SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
				Date date = (Date)value;
				return sdf.format(date);
			}
			return value == null ? "" : value.toString();
		} catch (Exception e) {
			return "";
		}
//		return null;
	}
	
	public String getDatePattern() {
		return datePattern;
	}

	public void setDatePattern(String datePattern) {
		this.datePattern = datePattern;
	}
}

第三步,在使用JSONObject或JSONArray的方法fromObject(obj,jsonConfig);
最后输出的日期格式就是我们想要的格式了。如下图:

非常简单 这个JSON对日期的处理 是不是很像Structs框架 在ActionForm里处理时间Date呢,一个是输出一个是输入,都是通过框架自带的类进行格式的转换,主要就是时间日期的处理。
有兴趣的朋友可以看看我写的 ActionForm处理日期的文章 地址:http://blog.csdn.net/lany1988/article/details/69386736








  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值