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. php二分查找

    // 递归版本 function bin_sch($arr,$low,$high,$val) { if($low<$high){ $mid = intval(($low+$high)/2); i ...

  2. C# 字符串驻留池

    在.Net中,对于相同的字符串,.Net会将它们指向同一个地址,它们是相同的实例..Net中的字符串并不会更新,当更改一个字符串变量时,由于字符串的不可变性,.Net实际上是新创建一个字符串,而将变量 ...

  3. xargs mv命令使用方法:ls *.mp3 |xargs -i mv {} /tmp

    ls  *.mp3 |xargs -i  mv {} /tmp 或者 find . -name "*.mp3" -exec mv {} /tmp \;

  4. VS2008远程调试方法

    在网上找了好多资料才把这个调试环境搭好,下面总结一下: 先说明两个概念: 1.      目标机:远程需要调试的机子,也就是被调试程序exe所在的机子,该机子可以安装VS2008或者不安装vs2008 ...

  5. ASP.NET中连接数据库的各种方法

    ASP.NET中连接数据库的各种方法 连接SQL数据库的方法:(一).在Web.Config中创建连接字符串:1.<add name="ConnectionString" c ...

  6. java连接oracle数据库详细代码

    详细代码: import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;imp ...

  7. 华为Java笔试题

    华为Java笔试题+数据库题 一. 单项选择题 1.Java是从( )语言改进重新设计. A.Ada B.C++ C.Pasacal D.BASIC 2.下列语句哪一个正确( ) A. Java程序经 ...

  8. Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)的创建过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7867340 在前面一篇文章中,我们分析了And ...

  9. stagefright框架(三)-选择Video Decode

    在<Stagefright (1) – Video Playback的流程>中,我们并没有详述Stagefright是如何根据影片档的类型来选择适合的video decoder,现在,就让 ...

  10. 解决安装Visual Studio 2012后SQL Server 2008 远程过程调用失败的问题

    安装了Visual Studio 2012后,打开SQL Server 2008配置管理器,发现了一个问题.如下图 解决办法: