博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Json让Java和C#沟通的方法
阅读量:7237 次
发布时间:2019-06-29

本文共 3622 字,大约阅读时间需要 12 分钟。

 

我们在项目里经常要涉及到各模块间的通信,这其中又不可避免要碰到各类语言间之间的通信,比如之前做的一个项目里面就是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
public
class
NotifyRealTimeMessage
implements
Serializable {   
     
    
private 
static 
ObjectMapper mapper =
new 
ObjectMapper();
 
    
static 
{
        
SimpleDateFormat dateFormat =
new 
SimpleDateFormat(
                
"yyyy-MM-dd HH:mm:ss"
);
        
mapper.setDateFormat(dateFormat);
    
}
    
     
    
@JsonProperty
(
"messageType"
)
    
private 
int 
type;  
 
    
@JsonProperty
(
"geoData"
)
    
private 
Object message;
     
    
@JsonProperty
(
"time"
)
    
private 
Calendar time;
     
    
public 
int 
getType() {
        
return 
type;
    
}
     
    
public 
void 
setType(
int 
type) {
        
this
.type = type;
    
}
     
    
public 
Object getMessage() {
        
return 
message;
    
}
     
    
public 
void 
setMessage(Object message) {
        
this
.message = message;
    
}
     
    
public 
Calendar getTime() {
        
return 
time;
    
}
     
    
public 
void 
setTime(Calendar time) {
        
this
.time = time;
    
}
     
    
/**
     
* 产生Json串
     
*
     
*/
    
public 
String toJson()
throws 
JsonGenerationException,
            
JsonMappingException, IOException {
 
        
return 
mapper.writeValueAsString(
this
);
    
}
 
    
/**
     
* 从Json字符串构建NotifyRealTimeMessage对象
     
*
     
*/
    
public 
static 
NotifyRealTimeMessage fromJson(String json)
throws 
JsonParseException,
            
JsonMappingException, IOException {
         
        
if 
(json ==
null
) {
            
return 
null
;
        
}
else 
{
            
return 
mapper
                    
.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
public 
class 
RealTimeDataMsg
{
        
[JsonProperty(
"messageType"
)]
        
public 
int 
MessageType {
get
;
set
; }
 
        
[JsonProperty(
"geoData"
)]
        
public 
GeoData Data {
get
;
set
; }
 
        
[JsonProperty(
"time"
)]
        
public 
DateTime 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
public 
static 
class 
JsonHelper
{
        
private 
static 
readonly 
JsonSerializerSettings MyJsonSerializerSettings;
 
        
static 
JsonHelper()
        
{
           
MyJsonSerializerSettings =
new 
JsonSerializerSettings();
           
IsoDateTimeConverter dateTimeConverter =
new 
IsoDateTimeConverter();
           
dateTimeConverter.DateTimeFormat =
"yyyy-MM-dd HH:mm:ss"
;
           
MyJsonSerializerSettings.Converters.Add(dateTimeConverter);
        
}
 
        
public 
static 
T FromJson<T>(
string 
json)
        
{
            
if 
(
string
.IsNullOrEmpty(json))
            
{
                
return 
default
(T);
            
}
            
return 
JsonConvert.DeserializeObject<T>(json, MyJsonSerializerSettings);
        
}
 
        
public 
static 
string 
ToJson<T>(T data)
        
{
           
return 
JsonConvert.SerializeObject(data, MyJsonSerializerSettings);
        
}
}

在C#中,使用起来也很方便,RealTimeDataMsg realMsg = JsonHelper.FromJson<RealTimeDataMsg>(json);string json = JsonHelper.ToJson(realMsg);。这里同样需要给MyJsonSerializerSettings设置好事先约定的时间格式:yyyy-MM-dd HH:mm:ss,这样才能正确的解析Java生成的Json串。

 

转自:

转载地址:http://nerfm.baihongyu.com/

你可能感兴趣的文章
MySQL练习题
查看>>
Cucumber 入门【转】
查看>>
JDBC为什么要使用PreparedStatement而不是Statement
查看>>
【python3的学习之路一】输入和输出
查看>>
关于ST-Link的internal command error问题的解决方法
查看>>
[整理] 两种方法查看MFC源代码
查看>>
字符常量 java
查看>>
面试中,应聘者问面试官的问题
查看>>
用js实现翻牌的效果
查看>>
Linux 中文设置
查看>>
再写mock对象
查看>>
hg vs git :这个世界除了svn还有别的
查看>>
BZOJ1095:[ZJOI2007]Hide 捉迷藏(动态点分治)
查看>>
[LeetCode] Word Break II
查看>>
两句话解决代理问题
查看>>
熊市中,值得关注的项目都有这三大特征
查看>>
2018.12.27-dtoj-4089-line
查看>>
10:比较整数大小经典案例
查看>>
ES06--elasticsearch
查看>>
pytorch1.0 用torch script导出模型
查看>>