gpt4 book ai didi

json - Go Unmarshal reflect.Type 得到了 map[string]interface{}

转载 作者:IT王子 更新时间:2023-10-29 02:02:48 28 4
gpt4 key购买 nike

我想将 json 字符串转换为一些结构,用作 func 参数
我使用反射来获取参数类型,这个工作正常,
但是如果我使用 json.Unmarshal 我总是得到 map[string]interface{}

这是一个迷你运行示例,文件名为json_test.go

package testJson

import (
"reflect"
"encoding/json"
"testing"
"log"
)

type LoginForm struct {
Name string
}

func Login(login LoginForm) {

}

func TestRun(t *testing.T) {
_func := Login
f := reflect.ValueOf(_func)
funcType := f.Type()
paramType := funcType.In(0)
log.Print(paramType.Name())
v := reflect.New(paramType).Elem().Interface()
jsonstr := `{"Name":"123"}`
log.Print(jsonstr)
log.Print(reflect.TypeOf(v).Name())
log.Print("%+v", v)
err := json.Unmarshal([]byte(jsonstr), &v)
if err != nil {
panic(err)
}
log.Print(reflect.TypeOf(v).Name())
log.Print( v)
var in []reflect.Value
in = make([]reflect.Value, funcType.NumIn())
in[0] = reflect.ValueOf(v)
f.Call(in)
}

感谢您的帮助!

最佳答案

不要reflect.New指针类型,因为它的结果是指向指针的指针,而不是 reflect.New Elem指针类型。

改变这个:

v := reflect.New(paramType).Elem().Interface()

对此:

v := reflect.New(paramType.Elem()).Interface()

此时v已经是指向 LoginForm 的指针所以你不需要用 & 来获取它的地址传递给 Unmarshal 时.

https://play.golang.org/p/JM4fRXb7fo


也是你得到 map[string]interface{} 的原因是因为 Interface() 的返回类型方法不足为奇interface{} ,所以虽然 v的基础类型可以是任何它的“最顶层”类型是 interface{} .那么,做&v会给你*interface{}而不是预期*LoginForm .而在 docs你会发现尝试将 JSON 对象解码为 interface{}将产生 map[string]interface{} 类型的值.

关于json - Go Unmarshal reflect.Type 得到了 map[string]interface{},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46112282/

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