【问题标题】:golang sending json on multicast ipgolang在多播IP上发送json
【发布时间】:2016-03-06 12:24:11
【问题描述】:

我正在编写一段 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 被转换为一个字节数组以使其工作。这是我的“接收器”功能:

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)?

【问题讨论】:

    标签: arrays json go multicast gorilla


    【解决方案1】:

    在您的代码中,您使用 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(),因为切片的其余部分包含 0s(您的第二个错误提示)但它们不是 json 文本的一部分!

    【讨论】:

    • 谢谢 icza,现在我遇到了另一个问题,在解组我的字节数组时确实会出现恐慌:json 输入意外结束。我应该打开一个包含更多详细信息的新问题吗?
    • 这意味着您传递给 json.Unmarshal()[]byte 不是完整的 JSON 编码文本。它甚至可以是空的。确保它包含整个 json 文本(检查其内容)。
    • 我了解(我的 json 与 UDP 相比相当庞大),您能建议我一种正确检查内容的方法吗?
    • @r3dlight 只需打印它,例如fmt.Println(n, string(b[:n]), b[:n]).
    • @r3dlight 确保将b[:n] 传递给json.Unmarshal(),因为切片的其余部分包含0s(您的错误提示)但它们不是json文本的一部分!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 2020-04-20
    • 2016-09-21
    • 2018-06-02
    • 1970-01-01
    相关资源
    最近更新 更多