2 回答
TA贡献1860条经验 获得超9个赞
处理此问题的常用方法是将指向输出值的指针传递给解码辅助函数。这避免了应用程序代码中的类型断言。
package main
import (
"encoding/json"
"fmt"
)
func FromJson(jsonSrc string, v interface{}) error {
return json.Unmarshal([]byte(jsonSrc), v)
}
func main() {
type person struct {
Name string
Age int
}
json := `{"Name": "James", "Age": 22}`
var p person
err := FromJson(json, &p)
fmt.Println(err)
fmt.Println(p)
}
TA贡献1784条经验 获得超2个赞
你的问题是你开始创建一个空的接口,并告诉json.Unmarshal解组它。虽然您已经定义了一个person类型,json.Unmarshal但无法知道这就是您想要的 JSON 类型。要解决此问题,请将 的定义person移至顶层(即,将其从main), and changeFromJson`的主体移至此:
func FromJson(jsonSrc string) interface{} {
var obj person{}
json.Unmarshal([]byte(jsonSrc), &obj)
return obj
}
现在,当您 return 时obj,interface{}返回的 将person作为其基础类型。您可以在Go Playground上运行此代码。
顺便说一句,你的代码有点不习惯。除了我的更正外,我没有修改原始的 Playground 链接,以免造成不必要的混乱。如果你很好奇,这里有一个经过清理的版本,使其更加地道(包括对我为什么做出改变的评论)。
- 2 回答
- 0 关注
- 327 浏览
添加回答
举报