跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请教下,静态类型语言单个接口可以接收多种结构 json 序列化后的数据,怎么处理比较好?
未分類
8 5 月 2020

请教下,静态类型语言单个接口可以接收多种结构 json 序列化后的数据,怎么处理比较好?

请教下,静态类型语言单个接口可以接收多种结构 json 序列化后的数据,怎么处理比较好?

資深大佬 : gamexg 8

例如一个接口,能够收到登录、更改密码两种请求,收到的 json 结构如下:

{     "t":"l", //登录     "username":"name1",     "password":"pass1" }  或  {     "t":"cp", // 更改密码     "username":"name1",     "oldpass":"oldpass",     "newpass":"newpass" } 

在未反序列化之前后端无法知道数据属于哪个结构,只能直接反序列化到通用 map 或者先反序列化一次获得类型 t 的值,然后再次解析到具体结构。

但是这两个方案都有些小问题,静态语言下,map 通用结构使用不方便;两次反序列化方案浪费 cpu 资源。

原来是尽可能的使用不同的接口处理不同结构的数据,tcp 连接等二进制协议则自定义包头来区分,一直没什么大问题。

但是最近在处理 websocket 大量消息,就不太好用了。不可能每个结构使用一个独立的 websocket 连接,而常用的二进制协议包头方案也因为 web 前端不太方便不能使用(我不是专业前端,可能会有误解)。

那么对于这种情况,静态类型语言后端怎么处理比较好?

目前我这里的方案是,固定成为类似这样的结构:

{     "t":"?",     "login":{                "username":"user1",                "password":"pass1",             },     "changepassword":{                "username":"name1",                "oldpass":"oldpass",                "newpass":"newpass"              } } 

login 时 login 字段有值,changepassword 为 null 的方式工作。请教下,还有其他更好的方案吗?

大佬有話說 (6)

  • 資深大佬 : wysnylc

    加个字段声明请求内容是约定的什么结构

  • 資深大佬 : optional

    Java 里 jackson subtype 可以直接吐出来

  • 資深大佬 : DGideas

    @wysnylc 这样的话,其实数据中的 t 已经可以代表了。

    @gamexg 我一开始的思路也是像你说的“先反序列化一次获得类型 t 的值,然后再次解析到具体结构。”,期待其他大佬有更好的解决方案。

  • 資深大佬 : teawithlife

    我能想到的有两个办法:
    1. 增加包头,不一定是二进制的包头,只要定长就可以了,前端应该很好实现。而且前端处理二进制也是没问题的,有对应的库
    2. 固定一个字段做匹配,比如要求有个”__type__”字段,用来表示结构体格式,然后先用 substring 一类的函数,把这段内容提取出来解析,确定了格式之后,就按对应的格式解析。

  • 資深大佬 : HuHui

    JSON-RPC?

  • 資深大佬 : cedoo22

    貌似 现在用的这个 就是最优解了

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具