gpt4 book ai didi

json - 反编码反射值

转载 作者:IT王子 更新时间:2023-10-29 01:27:21 26 4
gpt4 key购买 nike

Here is the code

package main

import (
"fmt"

"encoding/json"
"reflect"
)

var (
datajson []byte
//ref mapp
)

type mapp map[string]reflect.Type

type User struct {
Name string
//Type map[string]reflect.Type
}

func MustJSONEncode(i interface{}) []byte {
result, err := json.Marshal(i)
if err != nil {
panic(err)
}
return result
}
func MustJSONDecode(b []byte, i interface{}) {
err := json.Unmarshal(b, i)
if err != nil {
panic(err)
}

}
func Store(a interface{}) {
datajson = MustJSONEncode(a)
//fmt.Println(datajson)
}

func Get(a []byte, b interface{}) {
objType := reflect.TypeOf(b).Elem()
obj := reflect.New(objType)
//fmt.Println(obj)
MustJSONDecode(a, &obj)
fmt.Printf("%s", obj)
}

func main() {

dummy := &User{}
david := User{Name: "DavidMahon"}

Store(david)
Get(datajson, dummy)

}

在获取函数中

func Get(a []byte, b interface{}) {
objType := reflect.TypeOf(b).Elem()
obj := reflect.New(objType)
//fmt.Println(obj)
MustJSONDecode(a, &obj)
fmt.Printf("%s", obj)
}

我无法将 json 解码为底层对象类型。

这里有什么问题吗?我被困在这里了。一些非常简单但又很难弄清楚的事情。

谢谢

更新::此问题的目标是检索在 Get 函数中传递的类型完整的对象。

尼克在下面的评论中提到的方法并没有让我得到我之前已经尝试过的实际对象。我无论如何都可以在这样的 map 中检索数据(即使对象下面有递归对象)

func Get(a []byte) {
var f interface{}

//buf := bytes.NewBuffer(a)
//v := buf.String()
//usr := &User{}

MustJSONDecode(a, &f)
fmt.Printf("\n %v \n", f)
}

但是我需要返回实际对象,而不仅仅是数据。像 user := &User{"SomeName"} 这样的东西,我需要从 Unmarshall 返回 user 对象。诀窍在于反射(reflection)的某个地方,但不知道如何。

最佳答案

我对你为什么要这样做感到困惑,但这里是解决方法

func Get(a []byte, b interface{}) {
objType := reflect.TypeOf(b).Elem()
obj := reflect.New(objType).Interface()
//fmt.Println(obj)
MustJSONDecode(a, &obj)
fmt.Printf("obj = %#v\n", obj)
}

请注意对 Interface() 的调用.

Playground link

在我看来,当你已经在 b 中创建一个空的 &User 时,你会遇到很多麻烦,例如

func Get(a []byte, b interface{}) {
MustJSONDecode(a, &b)
fmt.Printf("obj = %#v\n", b)
}

但我猜这个计划还有一些在这里不明显的地方!

关于json - 反编码反射值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18294285/

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