java – GSon是否搞乱了Timestamp变量

我正在尝试通过套接字发送一个类,这一切都很好.但是,其中一个变量因为没有明显原因而搞砸了.让我进一步解释.

我正在使用的代码如下(对于客户端套接字,其中创建了GSon):

while(!someQueueVariable.isEmpty()){
     QueryHolder h = this.someQueueVariable.poll();
     Gson g = new Gson();
     String send = g.toJson(h);
     out.println(send);
}

QueryHolder是一个包含两个字符串和一个Object []的简单类.

我尝试了Netbeans的内置调试器,这些变量存在:

用蓝色突出显示的那些是你应该看的.正如你所看到的,首先是一个Timestamp对象,其值为2013-02-18 15:49:36.415,它变成了2013年2月18日下午3:49:36.我在这里做错了吗?它是GSon中的一个错误吗?

解决方法

在讨论创建自定义序列化器/反序列化器时,Gson User’s Guide提到了这一点.您所看到的是java.sql.Timestamp对象(它是Date的子类)的认序列化,它将以您的语言环境的格式输出/格式化它.

如果您查看Javadoc for GsonBuilder(),您将找到专门为您的问题创建的setDateFormat()方法 – 它不再需要自定义序列化程序.您只需要在JSON中提供所需的模式:

public static void main(String[] args)
{
    Timestamp t = new Timestamp(System.currentTimeMillis());
    System.out.println(t);
    System.out.println(t.toLocaleString());
    String json = new Gson().toJson(t);
    System.out.println(json);
    json = new GsonBuilder()
               .setDateFormat("yyyy-MM-dd hh:mm:ss.S")
               .create()
               .toJson(t);

    System.out.println(json);
}

输出(截至目前,显然):

2013-02-18 11:32:21.825 Feb 18,2013 11:32:21 AM “Feb 18,2013 11:32:21 AM” “2013-02-18 11:32:21.825”

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...