【问题标题】:json: cannot unmarshal string into Go value of type MyMap.mapjson:无法将字符串解组为 MyMap.map 类型的 Go 值
【发布时间】: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)

标签: json go


【解决方案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"])
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 2014-02-04
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      相关资源
      最近更新 更多