Golang 中国

初次做长连接服务,遇到点小问题,以前都是http的,以url确定服务

举个例子说得清楚点 比如有2个服务,一个登录一个聊天,客户端传过来对应的json是

登录: {“type”:”login”,”username”:”abc”,”password”:”123456”}
聊天: {“type”:”chat”,”from”:”张三”,”to”:”李四”,”content”:”李四你好”}
json的type字段就表明了请求什么服务

对于golang通常我们要把这俩json解析为对应的结构体:

type Login struct{

Type string
    Username string
    Password string
}

type Chat struct{
    Type string
    From string
    To string
    Content string
}

问题就是我在刚收到json字符串还不知道type是什么情况下怎么确定把该json解析到相应的结构体?我该 json.Unmarshal(json,?)

矛盾在于 这个type要解析过后才知道,然而解析的时候还不知道type我不知道该解析为哪个结构体 或者说我一开始的设计思路就是错的?


jimmykuu 于 2018-06-12 10:05 修改
2 回复
xinyu391
#1 xinyu391 • 2018-06-12 09:03

tcp 收到的是一堆byte数据,你如何确定bytes数据从哪到哪是一个完整的json?
如果你能解决这个问题,你提问的问题自然就能想到怎么解决。
一般tcp通信中每个数据包,都有个数据头,头里标示了必要的信息

jimmykuu
#2 jimmykuu • 2018-06-12 10:11

最简单做法先解析到 map[string]interface{} 类型,取出 type

还有种做法你可以参考:

{
  "type": "login",
  "data": "{\\"username\\": \\"abc\\", \\"password\\": \\"123456\\"}"
}

map[string]string 解析后,再根据 type 解析相应的 data

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。