当前位置:  开发笔记 > 编程语言 > 正文

golang在多播ip上发送json

如何解决《golang在多播ip上发送json》经验,为你挑选了1个好方法。

我正在写一个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被转换为一个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)
    }
}

如何将一个字节数组转换为map [string] interface(json)?



1> icza..:

在您的代码中,您曾经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]

笔记:

marshaling(json.Marshal())的结果是类型的值,[]byte因此您不需要在此处进行显式转换:

c.Write([]byte(myjson))

你可以简单地写:

c.Write(myjson)

另外,当解组时,请确保传递b[:n]json.Unmarshal(),因为切片的其余部分包含0s(您的第二个错误暗示)但它们不是json文本的一部分!


@ r3dlight确保你将`b [:n]`传递给`json.Unmarshal()`,因为切片的其余部分包含`0`s(你的错误暗示)但它们不是json文本的一部分!
推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有