You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言UDP接收JSON反序列化无法转为MyMap类型报错问题求助

Go JSON 反序列化问题排查与解决方案

本地测试代码错误修复

你本地测试代码的错误根源是多余的json.Marshal调用:
rawJson本身已经是符合JSON格式的字节数组,对字节数组执行序列化操作时,json.Marshal会将其转换为JSON字符串类型(字节会被转义后包裹在双引号中),后续反序列化时自然无法将字符串类型的值解析为MyMap结构体,就会抛出cannot unmarshal string into Go value of type main.MyMap错误。
修复方案:删除多余的序列化逻辑,直接使用rawJson执行反序列化即可。
修复后完整代码:

package main

import (
    "encoding/json"
    "fmt"
)

type MyMap struct {
    Param map[string]string `json:"packet"`
}

func main() {
    rawJson := []byte(`{
        "packet":{
            "hostname":"host1",
            "pid":"123435",
            "processname":"process",
            "type":"partial"}
        }`)

    var unmarshaled MyMap
    err := json.Unmarshal(rawJson, &unmarshaled)
    if err != nil {
        fmt.Printf("Error with unmarshaling: %v", err)
        return
    }

    fmt.Printf("Read a message from %v     %s \n", unmarshaled.Param["pid"], unmarshaled.Param["processname"])
}

UDP 反序列化错误修复

invalid character '\x01' looking for beginning of value错误是UDP开发场景下的常见问题,原因如下:
UDP是无连接的报文协议,接收数据时通常会提前声明固定长度的缓冲区,实际接收到的有效数据长度往往小于缓冲区总长度,缓冲区未被覆盖的区域会残留之前的脏数据(多为不可见控制字符),直接将整个缓冲区传入反序列化方法时,脏数据会破坏JSON格式导致解析失败。
修复方案:

  1. 调用UDP读接口时获取实际读取的字节长度n,仅截取缓冲区[:n]的有效数据段执行反序列化
  2. 如果UDP报文包含自定义协议头,需要先按照协议规则裁剪出纯JSON字节段再解析
    参考代码片段:
buf := make([]byte, 4096)
// 读取UDP报文,n为实际读取的字节数
n, remoteAddr, err := udpConn.ReadFromUDP(buf)
if err != nil {
    log.Printf("read udp failed: %v", err)
    return
}
// 仅使用有效长度的字节解析
var data MyMap
err = json.Unmarshal(buf[:n], &data)
if err != nil {
    log.Printf("unmarshal json failed: %v", err)
    return
}

内容的提问来源于stack exchange,提问作者MacCadley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:45:03