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. android sdk 如何重新生成debug.keystore

    1)首先你要确定你安装的JDK位置,Windows->Preferences->Java->Installed JREs,你可以看到是Jre的location,再在dos cmd模式 ...

  2. 如何提升app开发效率

    无论在什么行业,用户永远都是不可替代的“上帝”,一切的服务,开发都得按照用户的意愿来进行.然而在app开发领域中,专业的技术操作却并不像逛街淘货一样清晰可见,更多的需要app开发人员一行行代码敲出来, ...

  3. Android 操作系统的内存回收机制[转]

    转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-android-mmry-rcycl/ Android APP 的运行环境 Andro ...

  4. Android性能优化典范【转】

    2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关 ...

  5. hdu 4649 Professor Tian 多校联合训练的题

    这题起初没读懂题意,悲剧啊,然后看了题解写完就AC了 题意是给一个N,然后给N+1个整数 接着给N个操作符(只有三种操作  即  或 ,与 ,和异或 |   &  ^ )这样依次把操作符插入整 ...

  6. asp数组的使用

    定义简单数组 有两种方法在asp中定义和初始化数组,让我们看看每种的例子: 方法一:MyArray = Array("Jan","Feb","Mar& ...

  7. WebService 通用接收方法

    /** * @Title: getNetStatusRequest * @Description: TODO(2.1检查网络状态字符串) * @param: * @return: String * @ ...

  8. UGUI 锚点

    今天我们来学习下UGUI的锚点, 他是做什么的呢?  基本上就是用于界面布局. 1. 1个控件对应1个描点. 2. 描点分成四个小叶片,  每1个叶片 对应 控件四边框的角点 3. 不管屏幕如何放大缩 ...

  9. 格而知之9:一些关于GCD的笔记

    1.最近在重读当年刚开始学习多线程时的笔记,发觉其中有一些地方还是比较容易模糊,于是整理这篇笔记记录一下. 执行方式和队列 2.队列用来存放管理要执行的任务,它分为并发队列(Concurrent Di ...

  10. CF 338 D GCD Table(CRT)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 给定一个序列,a[1 ..k],问是否存在(i , ...