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处理,如图:

@Test
public void fun(){
    GsonBuilder builder = new GsonBuilder();
    builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
        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<TimeFormat>() {
            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,还有其他的。如果有人有更好的办法,可以分享分享。不胜感激。

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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它采用键值对的方式来描述数据,易于阅读和编写,同时也易于解析和生成,因此被广泛应用于Web开发。 下面是一个简单的JSON数据格式示例: ```json { "name": "张三", "age": 18, "gender": "male", "hobbies": ["reading", "swimming", "traveling"], "address": { "province": "广东省", "city": "深圳市", "district": "南山区" } } ``` 手动将对象或集合转换JSON类型的字符串,可以使用Java提供的JSON库,如Jackson、Gson等。以Jackson为例,代码如下: ```java ObjectMapper mapper = new ObjectMapper(); String jsonString = mapper.writeValueAsString(object); // object为需要转换的对象或集合 ``` 配置JSON类型转换需要在Spring MVC的配置文件添加相应的配置。以Jackson为例,代码如下: ```xml <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg value="yyyy-MM-dd HH:mm:ss"/> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> ``` 在以上配置,MappingJackson2HttpMessageConverter用于将Java对象转换JSON类型的字符串,同时也支持将JSON类型的字符串转换为Java对象。ObjectMapper用于配置JSON类型转换的一些参数,如日期格式等。以上配置将日期格式设置为"yyyy-MM-dd HH:mm:ss"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值