`
yacki
  • 浏览: 47126 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Java与C#间json时间格式互转完美解决方案

    博客分类:
  • .net
 
阅读更多
作用一种简单方便的数据传输方案,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);


使用这种方式格式化后的结果是
"2013-05-31T15:14:13.1294788+08:00"

b. JavaScriptDateTimeConverter


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();
}


      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;
	}
	
}


后记:

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

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


objectMapper.getDeserializationConfig().set(                org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);


感谢 elgs 和 bypasscc 对本文的支持。
分享到:
评论

相关推荐

    C#打表工具(完整源码) 导出JSON和编译JAVA文件

    在C#中调用Javac可以通过进程管理或者使用Java的.NET接口(IKVM或其他类似的解决方案)来实现。 6. 文件操作:在转换和生成代码的过程中,文件I/O操作是必不可少的,包括读取Excel文件,写入JSON文件,以及生成和...

    最新fastJSON C#的JSON开发包 v2.1.18

    - 开发者可以自定义序列化行为,如忽略特定属性、控制日期格式等,以满足特定需求。通过重写 `ToJson()` 和 `FromJson()` 方法,可以在类级别定制序列化逻辑。 5. **单元测试**: - 包含的 `UnitTests.nunit` ...

    json 中文乱码解决方案

    ### json 中文乱码解决方案 在处理JSON数据时,经常会出现中文乱码的问题,尤其是在不同编码格式间进行转换时更为常见。本文将详细介绍如何解决JSON中的中文乱码问题,并提供几种简单实用的方法来帮助开发者避免这...

    整合java和c#_Javac#交互_

    总结来说,Java与C#的交互涵盖了多种技术,包括Web服务、互操作性库、中间件和特定开发环境的支持。开发者可以根据实际需求选择合适的方法来实现跨语言的协作。尽管这两种语言在设计和语法上有显著差异,但现代软件...

    JSON的jar包 JSON的jar包

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言,包括C、C++、C#、Java、JavaScript、Perl、Python等的语法。这种简洁且易于读写的...

    JSON+AJAX,JSON,AJAX,JAVA ,教程,手册,入门,文档,json.pdf

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言(包括C、C++、C#、Java、JavaScript、Perl、Python等)的习惯,这使得JSON对于程序员...

    json-lib.rar

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言,包括C、C++、C#、Java、JavaScript、Perl、Python等的语法。JSON易于人阅读和编写,...

    JSON-XML相关jar包

    这个"JSON-XML相关jar包"提供了一站式的解决方案,帮助开发者轻松地在JSON和XML间切换,使得在不同场景下选择最适合的数据交换格式成为可能。通过理解和熟练使用这些库,可以提高项目的灵活性和兼容性。

    json-lib及相关jar包

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言(包括C、C++、C#、Java、JavaScript、Perl、Python等)的习惯,这使得JSON成为理想的...

    微信支付demo(包括java、C#、php)的源码案例

    它为商家和用户提供了一种安全、便捷的支付解决方案。在这个压缩包中,包含了三种主流编程语言——Java、C#和PHP的微信支付示例源码,帮助开发者快速理解和集成微信支付功能。 1. Java版本: Java作为企业级应用的...

    兼容 jdk 1.4 的json jar包

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言,包括C、C++、C#、Java、JavaScript、Perl、Python等。JSON是数据交换的理想选择,...

    json运行所需包共包含3个文件

    这三个库的结合使用,可以为Java开发者提供一个完整的解决方案,从读取JSON数据,将其转化为可操作的对象,再到将Java对象序列化回JSON格式,整个过程都得到了支持。这在开发需要与服务器进行数据交互的Web应用或者...

    json-lib-jdk15

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C语言家族的习惯,包括C、C++、C#、Java、JavaScript、Perl、Python等。JSON易于人阅读和编写,...

    JSON 类库使用的jar包

    它采用完全独立于语言的文本格式,但也使用了类似于C家族语言(包括C、C++、C#、Java、JavaScript等)的习惯,使得这些语言的程序员可以很容易地阅读和编写JSON。在IT行业中,JSON被广泛用于Web服务的数据交互,因为...

    C#调用JAVA案例

    本案例主要关注的是"C#调用JAVA"的实现,即如何让C#客户端能够与Java服务器进行交互。HessianTest是一个具体的示例,它展示了如何利用Hessian协议来完成这种通信。下面将详细介绍这个过程及其相关知识点。 Hessian...

    常用的9个json的jar包

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言的习惯,包括C、C++、C#、Java、JavaScript、Perl、Python等。JSON易于人阅读和编写,...

    Json解析demo

    5. JSON与其他语言的交互:除了JavaScript,Python、Java、C#等语言也有内置的JSON库,如Python的`json`模块,Java的`org.json`包,C#的`System.Text.Json`类库等,使得不同语言间的数据交换变得便捷。 6. JSON ...

    json jar 包

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言的习惯,包括C、C++、C#、Java、JavaScript、Perl、Python等。JSON易于人阅读和编写,...

    JSON-LIB快速入门

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言(包括C、C++、C#、Java、JavaScript、Perl、Python等)的习惯,这些特性使JSON成为...

    JSON需要的jar包

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言(包括C、C++、C#、Java、JavaScript、Perl、Python等)的习惯,这使得JSON成为理想的...

Global site tag (gtag.js) - Google Analytics