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. sql helper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...

  2. HQL和Criteria(转)

    HQL(Hibernate Query Language)        面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分大小写):HQL中查的是对 ...

  3. SqlCommand类

    一.常用属性 CommandText 获取或设置要对数据源执行的 Transact-SQL 语句.表名或存储过程. CommandTimeout 获取或设置在终止执行命令的尝试并生成错误之前的等待时间 ...

  4. C# DES_AES_MD5_加密_解密

    一.DES加解密 DES一共就有4个参数参与运作:明文.密文.密钥.向量.其中这4者的关系可以理解为: 密文=明文+密钥+向量: 明文=密文-密钥-向量: 为什么要向量这个参数呢?因为如果有一篇文章, ...

  5. C#操作XML文档(XmlDocument、XmlNode、XmlAttribute、SelectSingleNode、SelectNodes、XmlNodeList)

    XML文档是一种通用的文档,这种文档既可以用.config作为后缀也可以用.xml作为后缀.XML文档主要由元素节点和节点的属性共同构成的.它有且仅有一个根节点,其他的节点全部都是根节点的子节点或者子 ...

  6. Android实现自适应正方形GridView

    Android实现自适应正方形GridView  

  7. 软件架构 "4+1" 视图模型

    1995年,Philippe Kruchten在<IEEE Software>上发表了题为<The 4+1 View Model of Architecture>的论文,引起了 ...

  8. mysql logstash 配置

    [elk@dr-mysql01 mysql]$ cat logstash_mysql.conf input { file { type => "zj_mysql" path ...

  9. Red and Black(BFS or DFS) 分类: dfs bfs 2015-07-05 22:52 2人阅读 评论(0) 收藏

    Description There is a rectangular room, covered with square tiles. Each tile is colored either red ...

  10. MongoDb Windows linux平台环境及主流编程语言驱动安装同时配置mongoDb的远程连接

    <一,>MongoDB 简介篇Ruiy; MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值 ...