#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 ytpeMyMap
, это сработает: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"])
}