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

 

咱们在项目里常常要涉及到各模块间的通讯,这其中又不可避免要碰到各种语言间之间的通讯,好比以前作的一个项目里面就是Java发的消息须要C#接收,(具体消息是怎么传输的能够使用RabbitMQ等,关于RabbitMQ的使用总结能够看我以前的博客),都是面向对象的语言,而面向对象的消息怎么反解析到C#是个难题。下面就是使用Json密器让Java和C#沟通的具体办法的总结。html

摘要: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。

1、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();。java

 

2、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串。json

 

转自:http://www.cnblogs.com/wgp13x/p/0effafd9f5283cbf36e62b4fb5e94c81.htmlc#

相关文章
相关标签/搜索