Gson对json中日期数据转换的问题

前言:在我们调用第三方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处理,如图:

Gson对json中日期数据转换的问题_第1张图片

@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)

这里多说一句,网上说的如图:

Gson对json中日期数据转换的问题_第2张图片

网上百度

真的不知道测试过没,百度基本上都是这个,我也不知道是我json写错了还是怎么回事,反正我通过这种方式是没实现出来(我的json如下:String str = "{\"name\":\"xcc\",\"date\":\"Wed Dec 25 17:25:57 CST 2019\"}";),如果有人这么实现过,请告诉下我。

我的实现方式是重写了一个对象(TimeFormat),构造器传参,重写toString方法。如图:

Gson对json中日期数据转换的问题_第3张图片

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改成我写的这个对象

Gson对json中日期数据转换的问题_第4张图片

Person修改

Gson对json中日期数据转换的问题_第5张图片

@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为例,修改下,如图:

Gson对json中日期数据转换的问题_第6张图片

二次修改TimeFormat

Gson对json中日期数据转换的问题_第7张图片

Person

Gson对json中日期数据转换的问题_第8张图片

时间戳格式化为我们想要的格式

总结:以上就是我在日常开发中遇见的问题,有的是API,有的是爬虫,在日期这会有各种形式出现,如果说不通过Gson转换,而是通过把数据下载下来,在for循环去改变,这真是很多余的步骤,数据量少还可以,数据量多也是不小的开销。所以我是从根源上直接去解决这样的问题(懒人没办法)。可能我的这种方式不是很好,因为将json转为实体bean不只有Gson,还有其他的。如果有人有更好的办法,可以分享分享。不胜感激。

喜欢的可以关注下头条号《老徐聊技术 》

你可能感兴趣的:(java)