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

本文共 3709 字,大约阅读时间需要 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串。

这样,Java端和C#端都做好了,搞了一个新耳机,还没煲好,煲耳机去喽!

 

 

 

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

你可能感兴趣的文章
c++学习笔记(c++中的引用)
查看>>
Servlet基本_画面遷移
查看>>
BZOJ2599:[IOI2011]Race(点分治)
查看>>
BZOJ3437:小P的牧场(斜率优化DP)
查看>>
MIT自然语言处理第三讲:概率语言模型(第四部分)
查看>>
使用python处理selenium中的鼠标悬停问题
查看>>
Oracle使用order by排序关于null值处理
查看>>
action间传多个参数时注意问题
查看>>
Vue2.0环境搭建和测试demo
查看>>
Windows 下安装Lua: 使用Visual Studio 2017来编译安装Lua
查看>>
JS使用默认图片代替页面上无法显示的图片
查看>>
Codeforces 918C - The Monster
查看>>
2016 Russian Code Cup (RCC 16), Final Round B - Cactusophobia
查看>>
左边定宽,右边自适应布局的几种方法
查看>>
Electron学习入门
查看>>
Chapter 2、Eclipse(19th,Feb1)
查看>>
Vue和SuperSlide做轮播效果
查看>>
Spring源码分析——BeanFactory体系之接口详细分析
查看>>
几款swf flv flash网页播放器
查看>>
你需要知道的三个 CSS3技巧(转)
查看>>