最近很忙啊,新项目下来了,都没时间写博客了。频率降低点,但不能不总结跟大家分享啊。

我们在项目里经常要涉及到各模块间的通信,这其中又不可避免要碰到各类语言间之间的通信,比如之前做的一个项目里面就是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#端都做好了,搞了一个新耳机,还没煲好,煲耳机去喽!

来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/wgp13x/p/0effafd9f5283cbf36e62b4fb5e94c81.html

使用Json让Java和C#沟通的方法相关推荐

  1. JSON,java对象转json

    服务器返回给异步对象的数据载体: 1.HTML 2.XML 3.JSON 一)什么是JSON (1)JSON(Java Script Object Notation(记号,标记))是一种轻量级的数据交 ...

  2. java 对象转json,java首字母小写,判断方法是否为javabean方法

    将java对象转成json可用的类库很多,知名的有fastjson,jackson等,今天在做项目的时候发现项目没有上述依赖,用的是google的gson,因此封装方法将java对象转成gson代表的 ...

  3. json转java对象_json转java对象

    1.DTO:Data Transfer Object,数据传送对象 2.对于日期格式的问题,也已经处理 3.json-lib-2.2.2-jdk13.jar (2.1在日期数组 json->ja ...

  4. json与java反射_Java 对象的 Json 化与反 Json 化

    最近在家里修习 Java 这项技能,估计快点满技能点儿了,很开心.不过遇到了一个问题,困扰了我一阵子.问题是这样的,我要写 Android App,与服务器交互.大家都知道 Javascript 不知 ...

  5. JSON for java入门总结

    2019独角兽企业重金招聘Python工程师标准>>> 一.JSON介绍 JSON(JavaScript Object Notation),类似于XML,是一种数据交换格式,比如JA ...

  6. JSON与Java对象的互相转换

    JSON与Java对象的互相转换 例一(单个对象进行赋值): @RequestMapping("test1.do")@ResponseBodypublic JSONObject t ...

  7. json 转换 java odl_JSON与JAVA数据的转换

    1. List集合转换成json代码 List list = new ArrayList(); list.add( "first" ); list.add( "secon ...

  8. Spring: 读取 .properties 文件地址,json转java对象,el使用java类方法相关 (十三)

    1. 在Java中获取 .properties 文件的路径 (src/main/resources 下) ProjectName |---src/main/java |---src/main/reso ...

  9. 使用Json出现java.lang.NoClassDefFoundError解决方法

    使用Json出现java.lang.NoClassDefFoundError解决方法 参考文章: (1)使用Json出现java.lang.NoClassDefFoundError解决方法 (2)ht ...

最新文章

  1. 《Python编程从入门到实践》学习笔记3:列表
  2. Facebook如何将QUIC应用于数十亿流量传输
  3. 基于FPGA的LED 16×16点阵汉字显示设计
  4. 动态规划应用--最长递增子序列 LeetCode 300
  5. java gson 工具类_GSON 实体 转换工具类
  6. [Node.js] nodejs 连接 mysql数据库
  7. 【设计模式】建造者模式(生成器模式)
  8. 泛微 linux mobile手册,泛微E-Mobile5.0服务端安装手册.doc
  9. OPNsense用户手册-反病毒引擎
  10. Windows 10虚拟机Vmware 安装 黑苹果macos10.14
  11. SLAM数据集(tum/kitti)轨迹对齐与结果评估
  12. 编程题_排列组合问题
  13. PostgreSQL数据库统计信息——analyze大致流程
  14. Elasticsearch 映射参数 fields
  15. OA系统-员工的添加和查询-登录功能的实现
  16. 斑马打印机ZPL语言和EPL语言的区别是什么
  17. 使用阿里云ECS搭建Nextcloud私有云服务器
  18. 微信小程序的基本使用
  19. python离线下载第三方库
  20. 前端要学多久才能去工作?具备什么技能?

热门文章

  1. python list遍历 间隔_Python 列表(List) 的三种遍历(序号和值)方法
  2. github服务器停止响应,如何解决“git pull,致命:无法访问'https://github.com ... \':服务器空回复”...
  3. vs2013怎么清理解决方案_厕所漏水怎么办?厕所免拆砖防水维修方案
  4. java8和9兼容吗_甲骨文限制 Java 9 到 Java 8 的向后兼容性
  5. html input 字体颜色_input使用小技巧
  6. ai背景合成_AI设计制作万圣节夜景插画
  7. visual studio可以开发python吗_Visual Studio上开发Python六大功能
  8. 浏览器卡怎么办_【十全十美】宽带断线、wifi连不上怎么办?自助排障帮到你!...
  9. python不简单_不简单的python- 01基础
  10. 看漫画,学电子,我居然看懂了!