5

我正在尝试通过套接字发送一个类,这一切都很好。然而,其中一个变量无缘无故地被弄乱了。让我进一步解释一下。

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

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

QueryHolder 是一个简单的类,它包含两个Strings和一个Object[].

我尝试了 Netbeans 的内置调试器,并且出现了这些变量: 变量 以蓝色突出显示的变量是您应该查看的变量。如您所见,首先有一个值为 的 Timestamp 对象2013-02-18 15:49:36.415,它变成了Feb 18, 2013 3:49:36PM。我在这里做错了吗?这是GSon中的错误吗?

4

2 回答 2

14

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

如果您查看GsonBuilder() 的 Javadoc,您会发现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
2013 年 2 月 18 日上午 11:32:21
“2013 年 2 月 18 日上午 11:32:21”
“2013-02-18 11:32:21.825”

于 2013-02-18T18:37:13.117 回答
2

2013-02-18 15:49:36.415,变成了2013年2月18日下午3:49:36

这些有什么不同呢?这看起来像是一个渲染问题,您的时间戳正在通过SimpleDateFormat或类似的方式转换为字符串。

于 2013-02-18T15:12:13.993 回答