json: невозможно преобразовать строку в исходное значение типа myMap.map

#json #go

#json #Вперед

Вопрос:

Я столкнулся с проблемой маршалинга JSON в golang.

Мне нужно разобрать объект json, который я получаю из UDP-пакетов. Но я столкнулся с проблемой разархивирования — он не хочет разархивировать должным образом.

Я получаю «Ошибку с разархивированием: json: невозможно разобрать строку в исходное значение типа main.Ошибка myMap». Я тестировал по-разному, но чувствую себя застрявшим в этом примере — marshal и unmarshal в одной строке и все равно получаю ошибки.

     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, amp;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"])
}
 

Если я пытаюсь разобрать JSON, который я получил от UDP, ошибка говорит

 invalid character 'i/x01' looking for beginning of value
 

Я полагаю, что я получаю такого рода ошибки из-за моего непонимания системы маршала.
Я был бы признателен, если бы вы мне помогли
Спасибо!

Комментарии:

1. rawJson это (уже) текст в формате JSON. Почему вы ее маршалируете? При этом вы получите строку JSON, содержащую текст, который является текстом JSON. Если вы разархивируете rawJson непосредственно во vlaue ytpe MyMap , это сработает: err := json.Unmarshal(rawJson, amp;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), amp;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, amp;res)
    fmt.Printf("Read a message from %v     %s n", res.Param["pid"], res.Param["processname"])
}