前言:在我们调用第三方API的时候,大多数都是对数据进行存储的数据库或者直接做一些操作,然而我在开发中遇见最多的就是日期这块的转换,每一个API在日期上提供的都不是很一致,有的是时间戳(1577265957000),有的日期(Wed Dec 25 17:25:57 CST 2019),有的是字符串(2019-10-25)而我们不一定需要这种格式,比如比如返回时间戳的我们想要的是日期字符串。
我一般都是使用Gson来对json进行处理,但是他也不是很全面,比如对日期的处理,就不能直接说:
Gson gson = new Gson(); Person person = gson.fromJson(str,Person.class);
这样转换实现不了。只能另找出路了(使用GsonBuilder)。我开始演示各种转换
1、将时间戳(1577265957000)转为日期类型(Wed Dec 25 17:25:57 CST 2019)
首先定义的实体bean,必须使用Date类型,之后使用JsonDeserializer处理,如图:
@Test
public void fun(){
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Date.class, new JsonDeserializer() {
public Date deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
return new Date(json.getAsJsonPrimitive().getAsLong());
}
});
Gson gson = builder.create();
String str = "{\"name\":\"xcc\",\"date\":\"1577265957000\"}";
Person person = gson.fromJson(str,Person.class);
System.out.println(person.getDate());
}
2、将日期(Wed Dec 25 17:25:57 CST 2019)类型转为时间戳(1577265957000)
这里多说一句,网上说的如图:
网上百度
真的不知道测试过没,百度基本上都是这个,我也不知道是我json写错了还是怎么回事,反正我通过这种方式是没实现出来(我的json如下:String str = "{\"name\":\"xcc\",\"date\":\"Wed Dec 25 17:25:57 CST 2019\"}";),如果有人这么实现过,请告诉下我。
我的实现方式是重写了一个对象(TimeFormat),构造器传参,重写toString方法。如图:
public class TimeFormat {
private String str;
public TimeFormat(String str){
this.str = str;
}
@Override
public String toString() {
Date date = null;
try {
date = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy",
Locale.US).parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
return date.getTime()+"";
}
}
把Person中的Date改成我写的这个对象
Person修改
@Test
public void fun(){
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(TimeFormat.class, new JsonDeserializer() {
public TimeFormat deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
return new TimeFormat(json.getAsString());
}
});
Gson gson = builder.create();
String str = "{\"name\":\"xcc\",\"date\":\"Wed Dec 25 17:25:57 CST 2019\"}";
Person person = gson.fromJson(str,Person.class);
System.out.println(person.getDate());
}
3、将时间戳格式化为我们想要的格式如(YYYY-MM-dd)
与2的思路一样,重写一个对象,我这里还是以TimeFormat为例,修改下,如图:
二次修改TimeFormat
Person
时间戳格式化为我们想要的格式
总结:以上就是我在日常开发中遇见的问题,有的是API,有的是爬虫,在日期这会有各种形式出现,如果说不通过Gson转换,而是通过把数据下载下来,在for循环去改变,这真是很多余的步骤,数据量少还可以,数据量多也是不小的开销。所以我是从根源上直接去解决这样的问题(懒人没办法)。可能我的这种方式不是很好,因为将json转为实体bean不只有Gson,还有其他的。如果有人有更好的办法,可以分享分享。不胜感激。
喜欢的可以关注下头条号《老徐聊技术 》