如何在这个JSON反编组的例子中处理指针?

  • 本文关键字:处理 指针 JSON go
  • 更新时间 :
  • 英文 :


为了反序列化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中,就有可能编写一个适用于所有类型的函数。但在目前的系统约束下,这是不可能的。

相关内容

  • 没有找到相关文章

最新更新