gpt4 book ai didi

json - 解码 json 以反射(reflect)结构

转载 作者:IT王子 更新时间:2023-10-29 01:25:50 24 4
gpt4 key购买 nike

是否可以在不对原始类型进行硬编码的情况下将 JSON 解码为由反射构成的结构?

package main

import (
"fmt"
"encoding/json"
"reflect"
)

type Employee struct {
Firstname string `json:"firstname"`
}

func main() {
//Original struct
orig := new(Employee)

t := reflect.TypeOf(orig)
v := reflect.New(t.Elem())

//Reflected struct
new := v.Elem().Interface().(Employee)

// Unmarshal to reflected struct
json.Unmarshal([]byte("{\"firstname\": \"bender\"}"), &new)

fmt.Printf("%+v\n", new)
}

在这个例子中,我对 Employee 进行了强制转换。但是,如果我不知道类型怎么办?

当我只使用 v 进行解码时,结构将被清零。

json.Unmarshal([]byte("{\"firstname\": \"bender\"}"), v)

当我省略 Actor 时,我得到了一张 map 。这是可以理解的

json.Unmarshal([]byte("{\"firstname\": \"bender\"}"), v.Elem().Interface())

最佳答案

这里的问题是,如果你省略这里的类型断言:

new := v.Elem().Interface()

new 被推断为具有 interface{} 类型。

然后,当您获取要解码的地址时,&new 的类型为 *interface{}(指向接口(interface){} 的指针)并且解码不会按您预期的那样工作.

如果您直接使用指针引用而不是获取 Elem(),则可以避免类型断言。

func main() {
//Original struct
orig := new(Employee)

t := reflect.TypeOf(orig)
v := reflect.New(t.Elem())

// reflected pointer
newP := v.Interface()

// Unmarshal to reflected struct pointer
json.Unmarshal([]byte("{\"firstname\": \"bender\"}"), newP)

fmt.Printf("%+v\n", newP)
}

Playground :https://play.golang.org/p/lTBU-1PqM4

关于json - 解码 json 以反射(reflect)结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45679408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com