java+c#+json+时间_Java与C#间json日期格式互转完美解决方案
作用一种简单方便的数据传输方案,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日期格式互转完美解决方案相关推荐
- java 假设当前时间_java——推断日期是否在今天之前
这里说的日期是指字符串的日期格式,如"2014-10-15",我们要推断这个日期是否在今天之前,网上看到好多推断的方法,都是拿这个日期转换成Date对象 然后与new Date() ...
- java输出格林威治时间_Java之格林威治时间格式转换成北京时间格式
Java之格林威治时间格式转换成北京时间格式 /** * Copyright 2020. yaodouwang.com Studio All Right Reserved * * Create on ...
- java 控制台输出时间_Java获取时间打印到控制台代码实例
这篇文章主要介绍了Java获取时间打印到控制台代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 面试时有一道面试题:要求获取当时时间,并像电子 ...
- java 当前utc时间_Java获取UTC时间的方法详解
本文实例讲述了java获取utc时间的方法.分享给大家供大家参考,具体如下: 取得本地时间: java.util.calendar cal = java.util.calendar.getinstan ...
- java 获得当前时间_JAVA中获取当前系统时间
一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowStri ...
- java date当前时间_JAVA中获取当前系统时间
一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowStri ...
- java输出当前时间_JAVA中获取当前系统时间 - Matrix54 - 博客园
JAVA中获取当前系统时间 - Matrix54 - 博客园 一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleD ...
- web java获取当前时间_Java 获取当前系统时间的三种方法
准备工作: import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; 方式一: /** ...
- java 获取假期时间_java 获取n个工作日后的日期(包含法定节假日、双休日、节后补班)...
1.说明: 获取n个工作日后的日期(包含法定节假日.双休日.节后补班),需要在数据库手动入库当年的法定节假日及节假日调休补班.(也可写在配置文件中读取) 2.工具类代码 import java.tex ...
最新文章
- Linux/CentOS优化配置 汇总
- 用存储过程还原数据库
- PHP、JS 中 encode/decode
- 作为一名前端开发工程师,你必须掌握的WEB模板引擎:Handlebars
- unsigned long long 溢出 乘_Java整数相加溢出怎么办?Java8一步搞定
- 携号转网,用户最关心的还是网络质量
- java为什么密码比字符串更喜欢char []?
- java 获取http地址_java如何获取当前时间,java如何获取ip地址
- jquery templates jQuery html模板
- session用户账号认证(一个用户登陆,踢出前一个用户)
- Python编程:从入门到实践 11-3
- 大四学生发明文言文编程语言,设计思路清奇
- c语言单片机实验报告,本科单片机c语言实验手册(实验报告).doc
- Java基于WEB的商品库存管理系统
- python入门自学软件手机版_python编程入门
- pandas 选择数据与条件筛选iloc/loc/filt
- Google Chrome插件开发-Context Menus
- 使用OSM通过ArcGis显示城市线路地图
- [Android] 该文件包与具有同一名称的现有文件包存在冲突
- 常用日本语1000句+简单用语
热门文章
- 谁说 Java 不能用来跑 Serverless?
- 马斯克公布猴子成功用“意念”打游戏,脑机接口技术距离人类还有多远?
- Deno 冲上榜首,Vue.js 首次屈居第二,JavaScript 2020 年度“新起之秀”都有谁?
- Python 实现信息自动配对爬虫排版程序
- 混合架构、暗数据...这些云原生安全 bug 稍不留神会带来灾难!
- 2020 年,Android 还有哪些新期待?
- ​京东云:原来落地 AI 应用是这么回事儿!
- 一文详解 Java 的八大基本类型!
- 深度学习入门有多难?这篇带你零基础入行
- 没有光芯片,何谈 5G 与 AI !