Json与Bean互转,Timestamp类型的问题

本文介绍如何在JavaBean与JSON互相转换时处理Timestamp类型的字段,通过实现特定的转换器来确保时间戳能够正确地被格式化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Json与Java Bean互相转换时,Bean中的Timestamp字段是无法直接处理的,需要实现两个转换器。

DateJsonValueProcessor的作用是Bean转换为Json时将Timepstamp转换为指定的时间格式。

import java.text.SimpleDateFormat;

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

public class DateJsonBeanProcessor implements JsonValueProcessor {

private String[] formats;

public DateJsonBeanProcessor(String[] formats) {
this.formats = formats;
}

@Override
public Object processArrayValue(Object arg0, JsonConfig arg1) {
return null;
}

@Override
public Object processObjectValue(String key, Object value, JsonConfig arg2) {


if (value instanceof java.sql.Timestamp) {

SimpleDateFormat dateParser = null;
for (int i = 0; i < formats.length; i++) {
if (null == dateParser) {
dateParser = new SimpleDateFormat(formats[i]);
} else {
dateParser.applyPattern(formats[i]);
}
try {
return new SimpleDateFormat(formats[i]).format((java.sql.Timestamp) value);
} catch (Exception e) {
e.printStackTrace();
}
}

return null;
}
return value.toString();
}

}


TimestampMorpher的作用则与DateJsonValueProcessor相反,它是在Jsonl转换为Bean时,会把指定的时间格式转换为Timestamp
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import net.sf.ezmorph.MorphException;
import net.sf.ezmorph.object.AbstractObjectMorpher;

public class TimestampMorpher extends AbstractObjectMorpher {

private String[] formats;

public TimestampMorpher(String[] formats) {
this.formats = formats;
}

@Override
public Object morph(Object value) {

if (value == null) {
return null;
}
if (Timestamp.class.isAssignableFrom(value.getClass())) {
return (Timestamp) value;
}
if (!supports(value.getClass())) {
throw new MorphException(value.getClass() + " 是不支持的类型");
}
String strValue = (String) value;
SimpleDateFormat dateParser = null;
for (int i = 0; i < formats.length; i++) {
if (null == dateParser) {
dateParser = new SimpleDateFormat(formats[i]);
} else {
dateParser.applyPattern(formats[i]);
}
try {
return new Timestamp(dateParser.parse(strValue.toLowerCase()).getTime());
} catch (ParseException e) {
// e.printStackTrace();
}
}
return null;
}

@Override
public Class morphsTo() {

return Timestamp.class;
}

}


测试代码:
public class JsonTest {  
public static void main(String[] args) {
String jsonStr="{\"id\":\"101\",\"name\":\"张三\",\"age\":\"20\",\"birthday\":\"1992-10-19 23:52:18\"}";
Student s = new Student();
Timestamp b = Timestamp.valueOf("1992-10-19 23:52:18");
s.setId(123456);
s.setName("李四");
s.setAge(20);
s.setBirthday(b);

String[] formats = {"yyyy-MM-dd HH:mm:ss","yyyy-MM-dd"};
JSONUtils.getMorpherRegistry().registerMorpher(new TimestampMorpher(formats));
JSONObject jsonObject = JSONObject.fromObject(jsonStr);
Student s1 = (Student)JSONObject.toBean(jsonObject,Student.class);

System.out.println(s1.getBirthday());

JsonConfig config=new JsonConfig();
config.registerJsonValueProcessor(Timestamp.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
JSONObject json=JSONObject.fromObject(s1,config);
System.out.println(json.toString());
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值