作用一种简单方便的数据传输方案,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#中调用Javac可以通过进程管理或者使用Java的.NET接口(IKVM或其他类似的解决方案)来实现。 6. 文件操作:在转换和生成代码的过程中,文件I/O操作是必不可少的,包括读取Excel文件,写入JSON文件,以及生成和...
- 开发者可以自定义序列化行为,如忽略特定属性、控制日期格式等,以满足特定需求。通过重写 `ToJson()` 和 `FromJson()` 方法,可以在类级别定制序列化逻辑。 5. **单元测试**: - 包含的 `UnitTests.nunit` ...
### json 中文乱码解决方案 在处理JSON数据时,经常会出现中文乱码的问题,尤其是在不同编码格式间进行转换时更为常见。本文将详细介绍如何解决JSON中的中文乱码问题,并提供几种简单实用的方法来帮助开发者避免这...
总结来说,Java与C#的交互涵盖了多种技术,包括Web服务、互操作性库、中间件和特定开发环境的支持。开发者可以根据实际需求选择合适的方法来实现跨语言的协作。尽管这两种语言在设计和语法上有显著差异,但现代软件...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言,包括C、C++、C#、Java、JavaScript、Perl、Python等的语法。这种简洁且易于读写的...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言(包括C、C++、C#、Java、JavaScript、Perl、Python等)的习惯,这使得JSON对于程序员...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言,包括C、C++、C#、Java、JavaScript、Perl、Python等的语法。JSON易于人阅读和编写,...
这个"JSON-XML相关jar包"提供了一站式的解决方案,帮助开发者轻松地在JSON和XML间切换,使得在不同场景下选择最适合的数据交换格式成为可能。通过理解和熟练使用这些库,可以提高项目的灵活性和兼容性。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言(包括C、C++、C#、Java、JavaScript、Perl、Python等)的习惯,这使得JSON成为理想的...
它为商家和用户提供了一种安全、便捷的支付解决方案。在这个压缩包中,包含了三种主流编程语言——Java、C#和PHP的微信支付示例源码,帮助开发者快速理解和集成微信支付功能。 1. Java版本: Java作为企业级应用的...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言,包括C、C++、C#、Java、JavaScript、Perl、Python等。JSON是数据交换的理想选择,...
这三个库的结合使用,可以为Java开发者提供一个完整的解决方案,从读取JSON数据,将其转化为可操作的对象,再到将Java对象序列化回JSON格式,整个过程都得到了支持。这在开发需要与服务器进行数据交互的Web应用或者...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C语言家族的习惯,包括C、C++、C#、Java、JavaScript、Perl、Python等。JSON易于人阅读和编写,...
它采用完全独立于语言的文本格式,但也使用了类似于C家族语言(包括C、C++、C#、Java、JavaScript等)的习惯,使得这些语言的程序员可以很容易地阅读和编写JSON。在IT行业中,JSON被广泛用于Web服务的数据交互,因为...
本案例主要关注的是"C#调用JAVA"的实现,即如何让C#客户端能够与Java服务器进行交互。HessianTest是一个具体的示例,它展示了如何利用Hessian协议来完成这种通信。下面将详细介绍这个过程及其相关知识点。 Hessian...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言的习惯,包括C、C++、C#、Java、JavaScript、Perl、Python等。JSON易于人阅读和编写,...
5. JSON与其他语言的交互:除了JavaScript,Python、Java、C#等语言也有内置的JSON库,如Python的`json`模块,Java的`org.json`包,C#的`System.Text.Json`类库等,使得不同语言间的数据交换变得便捷。 6. JSON ...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言的习惯,包括C、C++、C#、Java、JavaScript、Perl、Python等。JSON易于人阅读和编写,...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言(包括C、C++、C#、Java、JavaScript、Perl、Python等)的习惯,这些特性使JSON成为...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言(包括C、C++、C#、Java、JavaScript、Perl、Python等)的习惯,这使得JSON成为理想的...