作用一种简单方便的数据传输方案,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

IsoDateTimeConverter convert = new IsoDateTimeConverter();

string ret = JsonConvert.SerializeObject(bean, Formatting.None, convert);

IsoDateTimeConverter convert = new IsoDateTimeConverter();

string ret = JsonConvert.SerializeObject(bean, Formatting.None, convert);

使用这种方式格式化后的结果是

"2013-05-31T15:14:13.1294788+08:00"

b. JavaScriptDateTimeConverter

JavaScriptDateTimeConverter convert = new JavaScriptDateTimeConverter();

string ret = JsonConvert.SerializeObject(bean, Formatting.None, convert);

JavaScriptDateTimeConverter convert = new JavaScriptDateTimeConverter();

string ret = JsonConvert.SerializeObject(bean, Formatting.None, convert);

使用这种方式格式化后的结果是

new Date(1369984667554)

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

2、解决方案

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

Java端:

JsonGenerator jsonGenerator = null;

ObjectMapper objectMapper = null;

objectMapper = new ObjectMapper();

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

objectMapper.getDeserializationConfig().setDateFormat(formatter);

try {

jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);

} catch (IOException e) {

e.printStackTrace();

}

String json = "{\"name\":\"YK\",\"value\":3,\"tm\":\"2013-05-31 02:53:20.123\"}";

try {

MyBean b = objectMapper.readValue(json, MyBean.class);

System.out.println(b.getTm());

} catch (Exception e) {

e.printStackTrace();

}

JsonGenerator jsonGenerator = null;

ObjectMapper objectMapper = null;

objectMapper = new ObjectMapper();

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

objectMapper.getDeserializationConfig().setDateFormat(formatter);

try {

jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);

} catch (IOException e) {

e.printStackTrace();

}

String json = "{\"name\":\"YK\",\"value\":3,\"tm\":\"2013-05-31 02:53:20.123\"}";

try {

MyBean b = objectMapper.readValue(json, MyBean.class);

System.out.println(b.getTm());

} catch (Exception e) {

e.printStackTrace();

}

IsoDateTimeConverter convert = new IsoDateTimeConverter();

convert.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff";

string ret = JsonConvert.SerializeObject(bean, Formatting.None, convert);

IsoDateTimeConverter convert = new IsoDateTimeConverter();

convert.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff";

string ret = JsonConvert.SerializeObject(bean, Formatting.None, convert);

文中用的到MyBean类型定义:

import java.sql.Timestamp;

public class MyBean {

private String name;

private String value;

private Timestamp tm;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getValue() {

return value;

}

public void setValue(String value) {

this.value = value;

}

public Timestamp getTm() {

return tm;

}

public void setTm(Timestamp tm) {

this.tm = tm;

}

}

import java.sql.Timestamp;

public class MyBean {

private String name;

private String value;

private Timestamp tm;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getValue() {

return value;

}

public void setValue(String value) {

this.value = value;

}

public Timestamp getTm() {

return tm;

}

public void setTm(Timestamp tm) {

this.tm = tm;

}

}

后记:

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

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

java+c#+json+时间_Java与C#间json日期格式互转完美解决方案相关推荐

  1. java 假设当前时间_java——推断日期是否在今天之前

    这里说的日期是指字符串的日期格式,如"2014-10-15",我们要推断这个日期是否在今天之前,网上看到好多推断的方法,都是拿这个日期转换成Date对象 然后与new Date() ...

  2. java输出格林威治时间_Java之格林威治时间格式转换成北京时间格式

    Java之格林威治时间格式转换成北京时间格式 /** * Copyright 2020. yaodouwang.com Studio All Right Reserved * * Create on ...

  3. java 控制台输出时间_Java获取时间打印到控制台代码实例

    这篇文章主要介绍了Java获取时间打印到控制台代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 面试时有一道面试题:要求获取当时时间,并像电子 ...

  4. java 当前utc时间_Java获取UTC时间的方法详解

    本文实例讲述了java获取utc时间的方法.分享给大家供大家参考,具体如下: 取得本地时间: java.util.calendar cal = java.util.calendar.getinstan ...

  5. java 获得当前时间_JAVA中获取当前系统时间

    一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowStri ...

  6. java date当前时间_JAVA中获取当前系统时间

    一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowStri ...

  7. java输出当前时间_JAVA中获取当前系统时间 - Matrix54 - 博客园

    JAVA中获取当前系统时间 - Matrix54 - 博客园 一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleD ...

  8. web java获取当前时间_Java 获取当前系统时间的三种方法

    准备工作: import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; 方式一: /** ...

  9. java 获取假期时间_java 获取n个工作日后的日期(包含法定节假日、双休日、节后补班)...

    1.说明: 获取n个工作日后的日期(包含法定节假日.双休日.节后补班),需要在数据库手动入库当年的法定节假日及节假日调休补班.(也可写在配置文件中读取) 2.工具类代码 import java.tex ...

最新文章

  1. Linux/CentOS优化配置 汇总
  2. 用存储过程还原数据库
  3. PHP、JS 中 encode/decode
  4. 作为一名前端开发工程师,你必须掌握的WEB模板引擎:Handlebars
  5. unsigned long long 溢出 乘_Java整数相加溢出怎么办?Java8一步搞定
  6. 携号转网,用户最关心的还是网络质量
  7. java为什么密码比字符串更喜欢char []?
  8. java 获取http地址_java如何获取当前时间,java如何获取ip地址
  9. jquery templates jQuery html模板
  10. session用户账号认证(一个用户登陆,踢出前一个用户)
  11. Python编程:从入门到实践 11-3
  12. 大四学生发明文言文编程语言,设计思路清奇
  13. c语言单片机实验报告,本科单片机c语言实验手册(实验报告).doc
  14. Java基于WEB的商品库存管理系统
  15. python入门自学软件手机版_python编程入门
  16. pandas 选择数据与条件筛选iloc/loc/filt
  17. Google Chrome插件开发-Context Menus
  18. 使用OSM通过ArcGis显示城市线路地图
  19. [Android] 该文件包与具有同一名称的现有文件包存在冲突
  20. 常用日本语1000句+简单用语

热门文章

  1. 谁说 Java 不能用来跑 Serverless?
  2. 马斯克公布猴子成功用“意念”打游戏,脑机接口技术距离人类还有多远?
  3. Deno 冲上榜首,Vue.js 首次屈居第二,JavaScript 2020 年度“新起之秀”都有谁?
  4. Python 实现信息自动配对爬虫排版程序
  5. 混合架构、暗数据...这些云原生安全 bug 稍不留神会带来灾难!
  6. 2020 年,Android 还有哪些新期待?
  7. ​京东云:原来落地 AI 应用是这么回事儿!
  8. 一文详解 Java 的八大基本类型!
  9. 深度学习入门有多难?这篇带你零基础入行
  10. 没有光芯片,何谈 5G 与 AI !