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());
}
}
分享到:
相关推荐
在Json中转化字符串到Bean时解决Timestamp格式数据报错问题
BeanUtils库是Apache的一个子项目,提供了方便的Java Bean操作方法,包括属性的设置和获取,以及对象到JSON的转换。 `JsonUtils`类包含以下核心方法: 1. `array2Json(Object[] array)`:此方法用于将一个Java对象...
FastJSON 直接支持日期类型数据的格式化,包括 java.util.Date、java.sql.Date、java.sql.Timestamp、java.sql.Time。 FastJSON 还提供了基于格式化输出的 SerializerFeature,例如 WriteDateUseDateFormat,能够...
总结一下,Spring Boot 2.0中日期格式化不生效的问题通常与自定义的Web MVC配置有关,特别是当使用`WebMvcConfigurationSupport`时。解决方法是在自定义配置类中添加一个日期转换的`Bean`,并确保它在消息转换器列表...
9. **@Temporal**: 这个JPA注解用于处理日期和时间类型的字段,例如指定Date类型的属性在数据库中以TemporalType.DATE(只保存日期部分)或TemporalType.TIMESTAMP(保存日期和时间)的形式存储。 以上只是部分关键...
在这个版本中,JavaEE引入了许多改进和新特性,旨在提升开发效率、可维护性和互操作性。下面将详细阐述JavaEE 8 API的关键知识点。 1. **Java Servlet 4.0**: - 支持HTTP/2协议,提高了网络传输效率和响应速度。 ...
10. **Hibernate Types**:这是一个社区维护的项目,提供了额外的Hibernate类型,如JSON、UUID、TIMESTAMP WITH TIME ZONE等,用于扩展Hibernate默认的数据类型支持。 以上是关于“Hibernate插件资料”中可能涉及的...
WebSocket与protobuf(Protocol Buffers)的结合则进一步提高了数据传输的效率和性能。protobuf是Google推出的一种高效的数据序列化协议,它能将结构化数据序列化为二进制流,相比JSON或XML,protobuf更紧凑、解析...
import org.apache.struts2.json.annotations.JSON; import org.springframework.beans.factory.annotation.Autowired; import com.jerehsoft.common.SystemConfig; import ...
datetime datetime TIMESTAMP datetime long bigint NUMBER bigint decimal decimal NUMBER(20,2) decimal 4 数据导出 String[] tables = new String[1]; tables[0] = "es_auth_action"; DBSolutionFactory....