golang 在多播 ip 上发送 json
golang sending json on multicast ip
我正在写一段 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)
}
}
所以我的 json 被转换为字节数组以使其工作。这是我的 "receiver" 功能:
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)
}
}
如何将字节数组转换为 map[string]接口 (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)
输出(在 Go Playground 上尝试):
map[key1:value1 key2:123]
备注:
编组 (json.Marshal()
) 的结果是 []byte
类型的值,因此您不需要在此处进行显式转换:
c.Write([]byte(myjson))
你可以简单地写:
c.Write(myjson)
此外,在解组时,请确保将 b[:n]
传递给 json.Unmarshal()
,因为切片的其余部分包含 0
s(您的第二个错误表明)但它们不是一部分json 文本!
我正在写一段 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)
}
}
所以我的 json 被转换为字节数组以使其工作。这是我的 "receiver" 功能:
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)
}
}
如何将字节数组转换为 map[string]接口 (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)
输出(在 Go Playground 上尝试):
map[key1:value1 key2:123]
备注:
编组 (json.Marshal()
) 的结果是 []byte
类型的值,因此您不需要在此处进行显式转换:
c.Write([]byte(myjson))
你可以简单地写:
c.Write(myjson)
此外,在解组时,请确保将 b[:n]
传递给 json.Unmarshal()
,因为切片的其余部分包含 0
s(您的第二个错误表明)但它们不是一部分json 文本!