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格式导致解析失败。
修复方案:
- 调用UDP读接口时获取实际读取的字节长度
n,仅截取缓冲区[:n]的有效数据段执行反序列化 - 如果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
相关产品推荐
相关产品推荐

