json:无法将字符串解组为 MyMap.map 类型的 Go 值
Posted
技术标签:
【中文标题】json:无法将字符串解组为 MyMap.map 类型的 Go 值【英文标题】:json: cannot unmarshal string into Go value of type MyMap.map 【发布时间】:2022-01-12 14:14:40 【问题描述】:我遇到了在 golang 中编组 JSON 的问题。
我需要解组从 UDP 数据包收到的 json 对象。 但我遇到了解组的问题 - 它不想正确解组。
我收到“解组错误:json:无法将字符串解组为 main.MyMap 类型的 Go 值”错误。 我以不同的方式进行了测试,但感觉卡在了这个例子上——marshaland unmarshal in a line,但仍然会出错。
package main
import (
"encoding/json"
"fmt"
"log"
)
type MyMap struct
Param map[string]string `json:"packet"`
func main()
rawJson := []byte(`
"packet":
"hostname":"host1",
"pid":"123435",
"processname":"process",
"type":"partial"
`)
data, err := json.Marshal(rawJson)
if err != nil
log.Println("Error with marchal JSON: " + err.Error())
var unmarshaled MyMap
err = json.Unmarshal(data, &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 收到的 JSON,则会出现错误提示
invalid character 'i/x01' looking for beginning of value
我相信我会因为对元帅系统的误解而得到这种错误。 如果你能帮助我,我将不胜感激 谢谢!
【问题讨论】:
rawJson
(已经)是一个 JSON 文本。你为什么要整理它?这样做你会得到一个 JSON 字符串,其中包含一个恰好是 JSON 文本的文本。如果您将 rawJson
直接解组为 ytpe MyMap
的值,则有效:err := json.Unmarshal(rawJson, &unmarshaled)
【参考方案1】:
您应该将rawjson
更改为字符串类型并将您的订单代码更改为:
package main
import (
"encoding/json"
"fmt"
)
type MyMap struct
Param map[string]string `json:"packet"`
func main()
rawJson := `
"packet":
"hostname":"host1",
"pid":"123435",
"processname":"process",
"type":"partial"
`
struct_instance := MyMap
if er := json.Unmarshal([]byte(rawJson), &struct_instance); er != nil
fmt.Println(er)
fmt.Println(struct_instance)
json_as_byte, er := json.Marshal(struct_instance)
if er != nil
fmt.Println(er)
fmt.Println(string(json_as_byte))
【讨论】:
【参考方案2】:我对你的代码做了一些改动,效果很好。
你可以在这里运行它:https://go.dev/play/p/jvw9MsVFbHt
type mp map[string]string
type MyMap struct
Param mp `json:"packet"`
func main()
rawJson := []byte(`
"packet":
"hostname":"host1",
"pid":"123435",
"processname":"process",
"type":"partial"
`)
data, err := json.Marshal(rawJson) //Not Required
if err != nil
fmt.Println("Error with marchal JSON: " + err.Error())
fmt.Println("data ", data)
var res MyMap
json.Unmarshal(rawJson, &res)
fmt.Printf("Read a message from %v %s \n", res.Param["pid"], res.Param["processname"])
【讨论】:
以上是关于json:无法将字符串解组为 MyMap.map 类型的 Go 值的主要内容,如果未能解决你的问题,请参考以下文章
将 json 数组解组为 go struct(数组在 JSON 字符串的中间
恐慌:json:无法将数组解组为 main.Structure 类型的 Go 值