回答

收藏

在 Go 中部分 JSON 解组为地图

技术问答 技术问答 305 人阅读 | 0 人回复 | 2023-09-12

我的 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 Y
    type sendMsg struct    User string    Msg  string}
    % S. F& S  m5 b' O9 G9 U$ j3 x/ P3 ?! u
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则