首页 > 解决方案 > 在这个 JSON 解组示例中,golang 如何处理指针?

问题描述

为了反序列化 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)
}

标签: go

解决方案


标准库 JSON 编组器将始终需要一个指向要解组的结构的指针。如果您尝试传入一个不是指针的值,json.InvalidUnmarshalError则将返回 a。

看来您正在尝试编写一个只返回一个值的方法。为此,您需要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,就可以编写一个适用于所有类型的函数。但在当前系统的限制下,这是不可能的。


推荐阅读