http://blog.csdn.net/wilsonke/article/details/24362851

 
作用一种简单方便的数据传输方案,JSON已经成为替代XML的事实标准。然而在JSON中,时间(DateTime,Timestamp,Date等)格式一直没有很好地统一,当需要跨平台序列化/反序列化时,遇到不少麻烦。作者经过反复尝试,解决了C#与Java通过JSON进行时间传输的困难。

C#解析Java/Javascript生成的JSON并不困难,但Java解析C#生成的JSON困难重重。下面就此问题重点介绍。

1、基本情况

Java端: 
Java端常用的json-lib库不支持Timestamp类型的反序列化(有人说可以改数据类型啊,对不起,很多都是历史代码不是想改就能改的)。而Jackson与gson能支持毫秒数形式的反序列化。应该说,Java的序列化行为是比较简单、符合常理的。

C#端: 
默认情况下,C#的时间将被格式化为 "/Date(1294499956278+0800)/" 这种形式。很显然,这种形式难以处理。

幸好,JsonConvert第三方库提供了两种额外的格式:

a. IsoDateTimeConverter

  1. IsoDateTimeConverter convert = new IsoDateTimeConverter();
  2. string ret = JsonConvert.SerializeObject(bean, Formatting.None, convert);
  1. IsoDateTimeConverter convert = new IsoDateTimeConverter();
  2. string ret = JsonConvert.SerializeObject(bean, Formatting.None, convert);

使用这种方式格式化后的结果是 
"2013-05-31T15:14:13.1294788+08:00"

b. JavaScriptDateTimeConverter

  1. JavaScriptDateTimeConverter convert = new JavaScriptDateTimeConverter();
  2. string ret = JsonConvert.SerializeObject(bean, Formatting.None, convert);
  1. JavaScriptDateTimeConverter convert = new JavaScriptDateTimeConverter();
  2. string ret = JsonConvert.SerializeObject(bean, Formatting.None, convert);

使用这种方式格式化后的结果是 
new Date(1369984667554)

然而,即使如此,C#的三种格式没有一种是与Java相同的,仍然无法正确对接。

2、解决方案

经过反复测试,最终决定两端均使用 "yyyy-MM-dd HH:mm:ss.SSS" 的格式进行传输,这也是到目前为止测试成功的唯一一种方案。

Java端:

  1. JsonGenerator jsonGenerator = null;
  2. ObjectMapper objectMapper = null;
  3. objectMapper = new ObjectMapper();
  4. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
  5. objectMapper.getDeserializationConfig().setDateFormat(formatter);
  6. try {
  7. jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. }
  11. String json = "{\"name\":\"YK\",\"value\":3,\"tm\":\"2013-05-31 02:53:20.123\"}";
  12. try {
  13. MyBean b = objectMapper.readValue(json, MyBean.class);
  14. System.out.println(b.getTm());
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  1. JsonGenerator jsonGenerator = null;
  2. ObjectMapper objectMapper = null;
  3. objectMapper = new ObjectMapper();
  4. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
  5. objectMapper.getDeserializationConfig().setDateFormat(formatter);
  6. try {
  7. jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. }
  11. String json = "{\"name\":\"YK\",\"value\":3,\"tm\":\"2013-05-31 02:53:20.123\"}";
  12. try {
  13. MyBean b = objectMapper.readValue(json, MyBean.class);
  14. System.out.println(b.getTm());
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  1. IsoDateTimeConverter convert = new IsoDateTimeConverter();
  2. convert.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff";
  3. string ret = JsonConvert.SerializeObject(bean, Formatting.None, convert);
  1. IsoDateTimeConverter convert = new IsoDateTimeConverter();
  2. convert.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff";
  3. string ret = JsonConvert.SerializeObject(bean, Formatting.None, convert);

文中用的到MyBean类型定义:

  1. import java.sql.Timestamp;
  2. public class MyBean {
  3. private String name;
  4. private String value;
  5. private Timestamp tm;
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public String getValue() {
  13. return value;
  14. }
  15. public void setValue(String value) {
  16. this.value = value;
  17. }
  18. public Timestamp getTm() {
  19. return tm;
  20. }
  21. public void setTm(Timestamp tm) {
  22. this.tm = tm;
  23. }
  24. }
  1. import java.sql.Timestamp;
  2. public class MyBean {
  3. private String name;
  4. private String value;
  5. private Timestamp tm;
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public String getValue() {
  13. return value;
  14. }
  15. public void setValue(String value) {
  16. this.value = value;
  17. }
  18. public Timestamp getTm() {
  19. return tm;
  20. }
  21. public void setTm(Timestamp tm) {
  22. this.tm = tm;
  23. }
  24. }

后记:

我使用的是比较老的.net 2.0,而C#的JSON转换在高版本中是提供原生支持的,此问题在4.0/4.5的Framework中是否有更好的解决方案,期待大家反馈。

另外,C#向Java传递数据时,其生成的Json中往往包含多余的字段,在服务器端解析时可能报错,解决方法如下:

Java与C#间json日期格式互转完美解决方案的更多相关文章

  1. java普通对象和json字符串的互转

    一.java普通对象和json字符串的互转 java对象---->json 首先创建一个java对象: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...

  2. 4种解决json日期格式问题的办法

    4种解决json日期格式问题的办法   开发中有时候需要从服务器端返回json格式的数据,在后台代码中如果有DateTime类型的数据使用系统自带的工具类序列化后将得到一个很长的数字表示日期数据,如下 ...

  3. 解决json日期格式问题的3种方法

    这篇文章主要介绍了解决json日期格式问题的3种方法 ,需要的朋友可以参考下 开发中有时候需要从服务器端返回json格式的数据,在后台代码中如果有DateTime类型的数据使用系统自带的工具类序列化后 ...

  4. json日期格式问题的办法

    //json日期转换 格式(2015-01-01) <input class="easyui-datebox" name="sbdj_txtShebaoka_Lin ...

  5. JS jQuery json日期格式问题的办法

    原生JS:Date对象详细参考 Date对象:基于1970年1月1日(世界标准时间)起的毫秒数 本文参考MDN做的详细整理,方便大家参考MDN 构造函数: new Date(); 依据系统设置的当前时 ...

  6. Java处理Excel中的日期格式

    Java处理Excel中的日期格式 2011-12-23 17:34:03|  分类: java |举报 |字号 订阅 下载LOFTER 我的照片书  |   在Excel中的日期格式,其数值为距离1 ...

  7. java工具类(五)之日期格式字符串与日期实现互转

    JAVA字符串转日期或日期转字符串 项目开发过程中需要实现日期格式的字符串与日期进行互转,并进行日期的加减操作. Demo如下: package weiming.lmapp.utils; import ...

  8. 关于JSON日期格式显示及My97日期控件

    1.My97日期控件.显示不同的日期格式,可以调整"dateFmt“的参数来配置: 详细DEMO:http://www.my97.net/demo/index.htm <p>日期 ...

  9. JSON 日期格式问题 /Date(1325696521000)/

    json返回的日期格式/Date(1325696521000)/,怎么办? Controller返回的是JsonResult对象就会导致出现这样的格式: /Date(1325696521000)/ p ...

随机推荐

  1. JavaScript插件 Bootstrap自带了13个jQuery插件,这些插件为Bootstrap中的组件赋予了“生命”

    原文:http://v2.bootcss.com/javascript.html#popovers

  2. 3D Touch:静态快速启动方式

    原文传送门:Add iOS 9’s Quick Actions shortcut support in 15 minutes right now !   苹果在iOS9 上引入3D触控(压力触控)功能 ...

  3. Hibernate HQL基础 使用参数占位符

    在HQL中有两种方法实现使用参数占用符 1.使用? 使用?设置参数占位符,之后通过setString()和setInteger()等方法为其赋值.如: Query query = session.cr ...

  4. Linux vps无法发送邮件

    首先安装sendmail软件...yum install sendmail /etc/init.d/php-fpm restart 来检查下sendmail是否正常运行 /etc/init.d/sen ...

  5. mysql服务的注册,启动、停止、注销。 [delphi代码实现]

    unit Service; interface uses Windows,Classes,SysUtils,Winsvc,winsock; Type {服务句柄信息} TScmInfo=Record ...

  6. C# 语法技巧_三目运算_switch_case

    一.三目运算符 三目运算符的一种简便写法: bool b = str == "abc" ? false : true; 当是自身时,实际上别吝啬那一个括号,有一个括号,实际上更容易 ...

  7. java设计模式--创建模式--原型模式

    原型模式: 原型模式 概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 .当一个系统应该独立于它的产品创建.构成和表示时. .当要实例化的类是在运行时刻指定时,例如,通过 ...

  8. Eclipse总是自动关闭

    -Dosgi.requiredJavaVersion=1.5把INI文件中的这一行删除掉,貌似这样以后模拟器也没再出现timeout的问题了,O(∩_∩)O哈哈~

  9. 大量客户反映wordpress的网站打开巨慢,经分析发现,这些网站大都使用了google的字体服务,由于最近google的服务已经被大陆屏蔽,所以wordpress的网站打开时,会卡在字体加载上。

     一会你安装完wp,发现打开巨卡的话,看看这个帖子:http://bbs.myhostcn.com/thread-1026-1-1.html最近一段时间,大量客户反映wordpress的网站打开巨慢, ...

  10. ubuntu下的Samba配置:使每个用户可以用自己的用户名和密码登录自己的home目录

    http://blog.csdn.net/fly_qj/article/details/21744797 1.先要安装Samba sudo apt-get install samba openssh- ...