|
我的 websocket 服务器接收和解组 JSON 数据。此数据将始终包含在具有键/值对的对象中。key-string 将作为值标识符告诉 Go 服务器是什么样的值?我可以通过知道什么样的值继续 JSON 将值解组成正确类型的结构。7 k7 f. L: M. t( `- V5 F) j
每个 json-object 可能包含多个键/值对。
3 m4 t2 y4 |- Y3 W. y; r. ?示例 JSON:
3 T1 I: j* ^0 r+ ?* O b6 h{ "sendMsg":{"user":"ANisus","msg":"Trying to send a message"}, "say":"Hello"}, {" P" }; m& k5 ]* ^$ W+ j* f
有没有简单的方法可以用这个?"encoding/json"包做到这一点?: Q% [8 S; O, X0 h. m E( F
package mainimport "encoding/json" "fmt")// the struct for the value of a "sendMsg"-commandtype sendMsg struct user string msg string}// The type for the value of a "say"-commandtype say stringfunc main(){ data := []byte(`{"sendMsg":{"user":"ANisus","msg":"Trying to send a message"},"say":"Hello"}`) // This won't work because json.MapObject([]byte) doesn't exist objmap,err := json.MapObject(data) // This is what I wish the objmap to contain var objmap = map[string][]byte { // "sendMsg": []byte(`{"user":"ANisus","msg":"Trying to send a message"}`), // "say": []byte(`"hello"`), fmt.Printf("%v",objmap)}
$ r( U% [$ c$ \0 N0 U1 P# \" x 感谢您的建议/帮助!
6 u: T, g5 t6 n) d5 x f
I$ ?3 z5 w$ Y- g$ P. C 解决方案: * ~% w8 w5 k# d5 j9 B
这可以通过将军map[string]json.RawMessage.1 t# }& h2 Q8 J
var objmap map[string]json.RawMessageerr := json.Unmarshal(data,&objmap)$ [, n. d6 O3 g6 s3 g# r0 q
进一步分析sendMsg,可执行以下操作:- L2 F) }3 X- _' d% |9 E! f, C
var s sendMsgerr = json.Unmarshal(objmap["sendMsg"],&s)/ r; d# V3 P4 G+ f! @
对于say,您可以执行相同的操作并将其解组成字符串: c' `/ } P9 P1 T, _ q& O3 ~
var str stringerr = json.Unmarshal(objmap["say"],&str)
; M m, A9 g$ I, G, g0 C/ {8 x# ^ 编辑:请记住,您还需要导出 sendMsg 正确解组结构中的变量。因此,您的结构定义将是:
# e, N, I; h: x, g+ L5 Ytype sendMsg struct User string Msg string}
% S. F& S m5 b' O9 G9 U$ j3 x/ P3 ?! u |
|