json - 为什么变量a(json字符串)没有解组到结构A?
问题描述
我可能在下面的代码中犯了一个菜鸟错误。这是去游乐场链接: https: //play.golang.org/p/WS_pPvBHUTH
我期待variable a
(json string) 被解组为 struct oftype A
但不知何故它最终成为type map[string]interface{}
package main
import (
"encoding/json"
"fmt"
)
type A struct {
ParamA string
}
type B struct {
ParamB string
}
var types = map[string]func() interface{}{
"ParamA": func() interface{} { return A{} },
"ParamB": func() interface{} { return B{} },
}
func Unmarshal(data []byte, key string) interface{} {
// if bytes.Contains(data, []byte("ParamA")) {
// var a A
// fmt.Printf("%+T\n", a)
// json.Unmarshal(data, &a)
// return a
// }
// var b B
// fmt.Printf("%+T\n", b)
// json.Unmarshal(data, &b)
// return b
if tmp, ok := types[key]; ok {
a := tmp()
fmt.Printf("%+T\n", a)
fmt.Println(string(data))
if err := json.Unmarshal(data, &a); err != nil {
return err
}
fmt.Printf("%+T\n", a)
return a
}
return nil
}
func main() {
a := []byte(`{"ParamA": "aaa"}`)
b := []byte(`{"ParamB": "bbb"}`)
resultA := Unmarshal(a, "ParamA")
resultB := Unmarshal(b, "ParamC")
fmt.Printf("%+v %+v\n", resultA, resultB)
}
预期输出:
main.A
{"ParamA": "aaa"}
main.A // <= this is what I want
{ParamA:aaa} <nil> // <= this is what I want
实际输出:
main.A
{"ParamA": "aaa"}
map[string]interface {} // <= but this is what I am getting
map[ParamA:aaa] <nil> // <= but this is what I am getting
为什么变量a(json字符串)没有解组到结构A?真的卡在这里了……
解决方案
这里:
a := tmp()
a
是类型interface{}
。然后你json.Unmarshal(data,&a)
,并覆盖a
.
您真正想要做的是,首先返回&A{}
或&B{}
从您的工厂函数返回,然后:
a:=tmp()
json.Unmarshal(data,a) // Not &a
推荐阅读
- android - 为什么我的 if 语句条件没有正确执行。安卓
- python - 如何使用 instabot 模块的 Like 功能?
- c++ - 如何转发未命名的函数参数
- nosql - 微服务应该只使用 nosql 数据库吗?
- java - 用java保存文件fiformat pdf文件
- react-native - 动画在本机反应中无法正常工作
- android - 如何在一个 RecycleView 中显示两个值?
- c# - Lambda如何在dbcontext中同时获取ThenInclude
- swiftui - SwiftUI NavigationView 在尝试孙子上一个下一个导航时出现父-子-孙场景问题
- javascript - 将 json 键值对添加到现有 json 时面临的问题