r3d*_*ght 4 arrays json multicast go gorilla
我正在写一个Go来发送多播udp上的json数据:
func send(a string, messages chan interface{}) {
addr, err := net.ResolveUDPAddr("udp", a)
CheckError(err)
c, err := net.DialUDP("udp", nil, addr)
CheckError(err)
for {
msg := <-messages
myjson, err := json.Marshal(msg)
if err != nil {
fmt.Println("Error encoding JSON")
return
}
//Write to bytes to multicast UDP
c.Write([]byte(myjson))
time.Sleep(2 * time.Second)
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的json被转换为一个byte数组,以使其工作.这是我的"接收器"功能:
func serveMulticastUDP(a string, messages chan interface{}) {
addr, err := net.ResolveUDPAddr("udp", a)
CheckError(err)
l, err := net.ListenMulticastUDP("udp", nil, addr)
l.SetReadBuffer(maxDatagramSize)
for {
b := make([]byte, maxDatagramSize)
n, src, err := l.ReadFromUDP(b)
if err != nil {
log.Fatal("ReadFromUDP failed:", err)
}
s := string(b[:n])//here is my problem, I want s to be map[string]interface before sending in my channel
messages<-s
log.Println(s)
log.Println(src)
log.Println(n)
//h(src, n, b)
}
}
Run Code Online (Sandbox Code Playgroud)
如何将一个字节数组转换为map [string] interface(json)?
在您的代码中,您曾经json.Marshal()
将值转换为JSON文本([]byte
).
另一个方向([]byte
- >值)可以使用json.Unmarshal()
.json.Unmarshal()
期待一个,[]byte
所以你甚至不必将其转换为string
.
看这个例子:
data := []byte(`{"key1":"value1","key2":123}`)
var m map[string]interface{}
if err := json.Unmarshal(data, &m); err != nil {
panic(err)
}
fmt.Printf("%+v", m)
Run Code Online (Sandbox Code Playgroud)
输出(在Go Playground上试试):
map[key1:value1 key2:123]
Run Code Online (Sandbox Code Playgroud)
笔记:
marshaling(json.Marshal()
)的结果是类型的值,[]byte
因此您不需要在此处进行显式转换:
c.Write([]byte(myjson))
Run Code Online (Sandbox Code Playgroud)
你可以简单地写:
c.Write(myjson)
Run Code Online (Sandbox Code Playgroud)
另外,当解组时,请确保传递b[:n]
给json.Unmarshal()
,因为切片的其余部分包含0
s(您的第二个错误暗示)但它们不是json文本的一部分!