用gson如何处理json转换Timestamp类型

本文详细介绍了在使用Gson进行JSON转换时,遇到日期格式不匹配的问题,并提供了通过设置日期格式和创建类型适配器来解决该问题的方法。

问题:项目中使用gson进行json的转换,但是在处理对象中的日期类型时,日期格式为“2011-8-31 11:11:11”不是我们期望的“2011-08-31 11:11:11”。

解决过程:

到网上搜索了一下解决方案如下

原代码: private static final Gson GSON = new Gson();

新代码:private static final Gson GSON = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();

改后测试了一下,竟然不起作用,奇怪!接着dubug了一下,发现原来因为使用了hibernate,对象中的日期类型时timestamp类型。上面的设置没起作用。接着又找了一下,还有对应方案如下

首先创建一个类型适配器

public class TimestampTypeAdapter implements JsonSerializer<Timestamp>, JsonDeserializer<Timestamp>{ private final DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public JsonElement serialize(Timestamp ts, Type t, JsonSerializationContext jsc) { String dfString = format.format(new Date(ts.getTime())); return new JsonPrimitive(dfString); } public Timestamp deserialize(JsonElement json, Type t, JsonDeserializationContext jsc) throws JsonParseException { if (!(json instanceof JsonPrimitive)) { throw new JsonParseException("The date should be a string value"); } try { Date date = format.parse(json.getAsString()); return new Timestamp(date.getTime()); } catch (ParseException e) { throw new JsonParseException(e); } } }

应用类型适配器

GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.setDateFormat("yyyy-MM-dd hh:mm:ss"); gsonBuilder.registerTypeAdapter(Timestamp.class,new TimestampTypeAdapter()); Gson GSON = gsonBuilder.create(); String json = GSON.toJson(new Timestamp((new Date()).getTime()));
Java中为JSON里的timestamp类型设值,有以下几种常见方法: ### 使用`net.sf.json`库并自定义`JsonValueProcessor` 通过自定义`JsonValueProcessor`,可以将Bean中的`Timestamp`转换JSON中的日期字符串。示例代码如下: ```java import java.sql.Timestamp; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import net.sf.json.JsonConfig; import net.sf.json.processors.JsonValueProcessor; import net.sf.json.JSONObject; class DateJsonValueProcessor implements JsonValueProcessor { public static final String Default_DATE_PATTERN = "yyyy-MM-dd"; private DateFormat dateFormat; public DateJsonValueProcessor(String datePattern) { try { dateFormat = new SimpleDateFormat(datePattern); } catch (Exception e) { dateFormat = new SimpleDateFormat(Default_DATE_PATTERN); } } public Object processArrayValue(Object value, JsonConfig jsonConfig) { return process(value); } public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) { return process(value); } private Object process(Object value) { return dateFormat.format((Date) value); } } class Student { private int id; private String name; private Timestamp birthday; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Timestamp getBirthday() { return birthday; } public void setBirthday(Timestamp birthday) { this.birthday = birthday; } } public class Main { public static void main(String[] args) { Student s = new Student(); s.setId(123456); s.setName("李四"); Timestamp b = Timestamp.valueOf("1992-10-19 23:52:18"); s.setBirthday(b); JsonConfig jsonConfig = new JsonConfig(); jsonConfig.registerJsonValueProcessor(Timestamp.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss")); JSONObject jsonObject = JSONObject.fromObject(s, jsonConfig); System.out.println(jsonObject.toString()); } } ``` 此方法可解决JsonJavaBean转换中不能正确转换`Timestamp`类型的问题,通过自定义处理器将`Timestamp`按指定格式转换为字符串存储在JSON中。 ### 使用Jackson库的`@JsonFormat`注解 在对象的属性上使用`@JsonFormat`注解,能指定`Timestamp`类型的输出格式。示例代码如下: ```java import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.ObjectMapper; import java.sql.Timestamp; class Student2 { private int id; private String name; @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") private Timestamp birthday; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Timestamp getBirthday() { return birthday; } public void setBirthday(Timestamp birthday) { this.birthday = birthday; } } public class Main2 { public static void main(String[] args) throws Exception { Student2 s = new Student2(); s.setId(123456); s.setName("李四"); Timestamp b = Timestamp.valueOf("1992-10-19 23:52:18"); s.setBirthday(b); ObjectMapper objectMapper = new ObjectMapper(); String jsonStr = objectMapper.writeValueAsString(s); System.out.println(jsonStr); } } ``` 这种方法利用注解在将Java对象转换JSON时,按指定格式输出`Timestamp`类型的数据。 ### 使用Gson库自定义类型适配器 创建一个类型适配器来处理`Timestamp`类型的序列化和反序列化。示例代码如下: ```java import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.lang.reflect.Type; class TimestampTypeAdapter implements JsonSerializer<Timestamp>, JsonDeserializer<Timestamp> { private final DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public JsonElement serialize(Timestamp ts, Type t, JsonSerializationContext jsc) { String dfString = format.format(new Date(ts.getTime())); return new JsonPrimitive(dfString); } public Timestamp deserialize(JsonElement json, Type t, JsonDeserializationContext jsc) throws JsonParseException { if (!(json instanceof JsonPrimitive)) { throw new JsonParseException("The date should be a string value"); } try { Date date = format.parse(json.getAsString()); return new Timestamp(date.getTime()); } catch (ParseException e) { throw new JsonParseException(e); } } } class Student3 { private int id; private String name; private Timestamp birthday; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Timestamp getBirthday() { return birthday; } public void setBirthday(Timestamp birthday) { this.birthday = birthday; } } public class Main3 { public static void main(String[] args) { Student3 s = new Student3(); s.setId(123456); s.setName("李四"); Timestamp b = Timestamp.valueOf("1992-10-19 23:52:18"); s.setBirthday(b); Gson gson = new GsonBuilder() .registerTypeAdapter(Timestamp.class, new TimestampTypeAdapter()) .create(); String jsonStr = gson.toJson(s); System.out.println(jsonStr); } } ``` 这种方法可以让Gson库正确处理`Timestamp`类型的序列化和反序列化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值