使用Json让Java和C#沟通的方法

最近很忙啊,新项目下来了,都没时间写博客了。频率降低点,但不能不总结跟大家分享啊。
我们在项目里经常要涉及到各模块间的通信,这其中又不可避免要碰到各类语言间之间的通信,比如之前做的一个项目里面就是Java发的消息需要C#接收,(具体消息是怎么传输的可以使用RabbitMQ等,关于RabbitMQ的使用总结可以看我之前的博客),都是面向对象的语言,而面向对象的消息怎么反解析到C#是个难题。下面就是使用Json密器让Java和C#沟通的具体办法的总结。
摘要:Json是Java和C#之间通信的利器,Java端将Java对象转变为Json串后发出,C#端接收到Json串后转换为C#对象;C#发出转变为Json串的对象,Java收到后解析成Java对象,Json串在不同语言之间起到一个桥梁的作用。对定义的Java或C#对象生成Json字串,以及从Json字串生成Java或C#对象,有很方便的方法,那就是Java下使用jackson,C#下使用Newtonsoft.Json,其中还有一些问题需要注意,如关于时间这种常见类型转换的问题,以下便是我对这方面的总结。
关键词:Json,Java,C#,jackson,Newtonsoft
前提:Java写的某种程序,C#写的某种程序。
需求:Java程序和C#程序它们之间需要交换某些信息,信息原本是用对象的形式封装的。
说明:使用jackson-all-1.9.0.jar及Newtonsoft.Json.dll。
一、Java
下面是一个简单的Java类示例,它包含了3个属性,并且提供了对象与Json串互转的两个方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | publicclassNotifyRealTimeMessage implementsSerializable {
privatestaticObjectMapper mapper = newObjectMapper();
static{
SimpleDateFormat dateFormat = newSimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
mapper.setDateFormat(dateFormat);
}
@JsonProperty("messageType")
privateinttype;
@JsonProperty("geoData")
privateObject message;
@JsonProperty("time")
privateCalendar time;
publicintgetType() {
returntype;
}
publicvoidsetType(inttype) {
this.type = type;
}
publicObject getMessage() {
returnmessage;
}
publicvoidsetMessage(Object message) {
this.message = message;
}
publicCalendar getTime() {
returntime;
}
publicvoidsetTime(Calendar time) {
this.time = time;
}
/**
* 产生Json串
*
*/
publicString toJson() throwsJsonGenerationException,
JsonMappingException, IOException {
returnmapper.writeValueAsString(this);
}
/**
* 从Json字符串构建NotifyRealTimeMessage对象
*
*/
publicstaticNotifyRealTimeMessage fromJson(String json) throwsJsonParseException,
JsonMappingException, IOException {
if(json == null) {
returnnull;
} else{
returnmapper
.readValue(json, NotifyRealTimeMessage.class);
}
}
}
|
toJson方法将NotifyRealTimeMessage对象转化为一个Json字符串,fromJson静态方法将一个Json串转化为一个NotifyRealTimeMessage对象,由于NotifyRealTimeMessage对象中包含一个时间类型的Calendar字段,故事先需要给mapper设定约定好的时间格式,mapper.SetDateFormat。这样使用它:NotifyRealTimeMessage notifyMessage = NotifyRealTimeMessage.fromJson(json);String json=notifyMessage.toJson();。
二、C#
以下是与Java类对应的C#类,它也包含了三个属性,但没提供与Json串转换的方法,注意JsonProperty标签里的名字跟Java类里的一样。
1 2 3 4 5 6 7 8 9 10 11 12 | publicclassRealTimeDataMsg
{
[JsonProperty("messageType")]
publicintMessageType { get; set; }
[JsonProperty("geoData")]
publicGeoData Data { get; set; }
[JsonProperty("time")]
publicDateTime Time { get; set; }
}
|
下面的是一个通用的做各类C#对象与Json字串之间转化的工具类,它使用泛型来实现,它提供了对象与Json串互转的两个方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | publicstaticclassJsonHelper
{
privatestaticreadonly JsonSerializerSettings MyJsonSerializerSettings;
staticJsonHelper()
{
MyJsonSerializerSettings = newJsonSerializerSettings();
IsoDateTimeConverter dateTimeConverter = newIsoDateTimeConverter();
dateTimeConverter.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
MyJsonSerializerSettings.Converters.Add(dateTimeConverter);
}
publicstaticT FromJson<T>(stringjson)
{
if(string.IsNullOrEmpty(json))
{
returndefault(T);
}
returnJsonConvert.DeserializeObject<T>(json, MyJsonSerializerSettings);
}
publicstaticstringToJson<T>(T data)
{
returnJsonConvert.SerializeObject(data, MyJsonSerializerSettings);
}
}
|
在C#中,使用起来也很方便,RealTimeDataMsg realMsg = JsonHelper.FromJson<RealTimeDataMsg>(json);string json = JsonHelper.ToJson(realMsg);。这里同样需要给MyJsonSerializerSettings设置好事先约定的时间格式:yyyy-MM-dd HH:mm:ss,这样才能正确的解析Java生成的Json串。
这样,Java端和C#端都做好了,搞了一个新耳机,还没煲好,煲耳机去喽!
来自为知笔记(Wiz)
以上是 使用Json让Java和C#沟通的方法 的全部内容,
来源链接:
utcz.com/z/393258.html