java 错误日期转正确日期_java – 将字符串日期转换为对象产生无效的时区指示符’0′...

值1476399300000从

Unix epoch开始看起来像ms.只需在Gson中添加一个类型适配器:

final class UnixEpochDateTypeAdapter

extends TypeAdapter {

private static final TypeAdapter unixEpochDateTypeAdapter = new UnixEpochDateTypeAdapter();

private UnixEpochDateTypeAdapter() {

}

static TypeAdapter getUnixEpochDateTypeAdapter() {

return unixEpochDateTypeAdapter;

}

@Override

public Date read(final JsonReader in)

throws IOException {

// this is where the conversion is performed

return new Date(in.nextLong());

}

@Override

@SuppressWarnings("resource")

public void write(final JsonWriter out, final Date value)

throws IOException {

// write back if necessary or throw UnsupportedOperationException

out.value(value.getTime());

}

}

配置您的Gson实例:

final Gson gson = new GsonBuilder()

.registerTypeAdapter(Date.class, getUnixEpochDateTypeAdapter())

.create();

Gson实例与UnixEpochDateTypeAdapter一样是线程安全的,并且可以作为一个全局实例存在.例:

final class Mapping {

final Date date = null;

}

final String json = "{\"date\":1476399300000}";

final Mapping mapping = gson.fromJson(json, Mapping.class);

System.out.println(mapping.date);

System.out.println(gson.toJson(mapping));

会给出以下输出:

Fri Oct 14 01:55:00 EEST 2016

{“date”:1476399300000}

请注意,类型适配器配置为覆盖默认的Gson日期类型适配器.因此,您可能需要使用更复杂的分析来检测是否只是Unix时代的ms.另请注意,您可以使用JsonDeserializer,但后者以JSON树方式工作,而类型适配器以流式方式工作,这种方式更有效,可能不会累积中间结果.

编辑:

此外,它可能看起来令人困惑,但Gson可以为原语进行值转换.尽管您的有效负载具有字符串值,但JsonReader.nextLong()可以将字符串原语读取为long值.所以UnixEpochDateTypeAdapter.write应该是out.value(String.valueOf(value.getTime()));为了不修改JSON文字.

编辑

还有一个更短的解决方案(使用JSON内存树而不是数据流),这简单:

final Gson builder = new GsonBuilder()

.registerTypeAdapter(Date.class, new JsonDeserializer() {

public Date deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {

return new Date(jsonElement.getAsJsonPrimitive().getAsLong());

}

})

.create();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值