为了反序列化JSON,我发现我们需要传递一个输出地址来检索结果,但出于某种原因,我更喜欢传统地检索结果。
下面是一个例子:https://play.golang.org/p/3hN1iLrDPGv
package main
import (
"encoding/json"
"fmt"
"time"
)
type FruitBasket struct {
Name string
Fruit []string
Id int64 `json:"ref"`
private string // An unexported field is not encoded.
Created time.Time
}
type FruitBaskets []FruitBasket
func Deserialize(val interface{}) interface{} {
serialBytes := `[{"Name":"Standard2","Fruit":["Apple","Banana","Orange"],"ref":999,"𒀸private":"Second-rate","Created":"2021-08-13T11:55:12.541568+07:00"}]`
err := json.Unmarshal([]byte(serialBytes),&val)
if err != nil {
fmt.Printf("err: %s", err)
}
return val
}
func main() {
out1 := Deserialize(&FruitBaskets{})
// out2 := out1.(FruitBaskets) // I want this line
out2 := out1.(*FruitBaskets)
fmt.Println("Testing and got..",out2)
}
stdlib JSON编组器总是需要一个指向要反编组到的结构的指针。如果你试图传递一个不是指针的值,那么将返回一个json.InvalidUnmarshalError
。
看起来你正试图写一个方法,将返回一个值。为了做到这一点,您需要为每个类型创建一个Deserialize()
函数,返回特定的类型。例如:
func Deserialize(in []byte) (FruitBasket, error) {
fb := &FruitBasket{}
err := json.Unmarshal(in, &fb)
if err != nil {
fmt.Printf("err: %s", err)
return FruitBasket{}, err
}
return *fb, nil
}
一旦泛型被引入到Go中,就有可能编写一个适用于所有类型的函数。但在目前的系统约束下,这是不可能的。