• 使用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 {   
         
        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#端都做好了,搞了一个新耳机,还没煲好,煲耳机去喽!





    作者:Angel 
    欢迎转载或分享,但请务必声明文章出处。
    如果文章对您有帮助,希望你能推荐关注

    王安琪,英文名Angel,南京邮电大学计算机应用技术硕士学位。 熟悉Java、C#编程语言。专注于WebService、海量数据处理、搜索引擎技术、消息中间件技术、分布式文件存储、.NET应用程序开发、系统架构设计。主要从事大数据管理系统的研发,项目经理,系统架构师,就职于江苏金陵科技集团有限公司。

    Email:aitanjupt@hotmail.com

    QQ:289770363 

  • 相关阅读:
    Sql获取表中随机1到n条数据
    SQLite相关
    Eclipse自动生成api时报错“警告: 编码 GBK 的不可映射字符”
    Git基础命令
    Oracle查询结果行转列,列转行
    字符串编码方式转换
    Java字符串匹配正则表达式
    python爬虫--编码问题y
    GET与POST方法
    python爬虫(1)--Urllib库的基本使用
  • 原文地址:https://www.cnblogs.com/wgp13x/p/0effafd9f5283cbf36e62b4fb5e94c81.html
Copyright © 2020-2023  润新知