我还在学习Go.我试图将json解组成一个struct.但是,struct有一个带标记的字段.使用反射,我试着看看标签中是否有字符串"json".如果确实如此,那么json to unmarshal应该简单地作为字符串解组到字段中.
例:
const data = `{"I":3, "S":{"phone": {"sales": "2223334444"}}}`
type A struct {
I int64
S string `sql:"type:json"`
}
Run Code Online (Sandbox Code Playgroud)
问题很简单 - 将json中的"S"解组为结构A中的字符串.
这就是我走了多远.但我被困在这里.
当该类型嵌入到结构中时,我一直在努力理解编码/解码接口类型与完全没有嵌入时的区别.
使用以下示例:在操场上
注意代码声明了一个接口IFace
.它声明了一个非导出的结构impl
.它设置了一些采空区的方法Register
,GobEncode
以及GobDecode
该impl
结构.
然后,它还声明了一个Data
导出的结构,并且具有一个Foo
接口类型的单个字段IFace
.
所以,有一个接口,一个实现它的结构,以及一个容器结构,它有一个字段,其值是接口类型.
我的问题是容器结构Data
很愉快地通过Gob gauntlet发送,当它通过时,它很高兴地对Data
结构中的IFace字段进行编码和解码......太棒了!但是,我似乎无法通过gob gaunt只发送一个IFace值的实例.
我错过了什么神奇的召唤?
搜索错误消息会给出一些结果,但我相信我已经满足了Gob合同......而且"证明"就是成功的结构化.显然我错过了一些东西,却看不到它.
注意,程序的输出是:
Encoding {IFace:bilbo} now
Encoding IFace:baggins now
Decoded {IFace:bilbo} now
decode error: gob: local interface type *main.IFace can only be decoded from remote interface type; received concrete type impl
Decoded <nil> now
Run Code Online (Sandbox Code Playgroud)
实际代码是:
package main
import (
"bytes"
"encoding/gob"
"fmt"
)
type IFace interface {
FooBar() string …
Run Code Online (Sandbox Code Playgroud) 这是一个示例(另请参见https://play.golang.org/p/or7z4Xc8tN):
package main
import (
"encoding/json"
"fmt"
)
type A struct {
X string
Y int
}
type B struct {
A
Y string
}
func main() {
data := []byte(`{"X": "me", "Y": "hi"}`)
b := &B{}
json.Unmarshal(data, b)
fmt.Println(b)
fmt.Println(b.A)
b = &B{}
data = []byte(`{"X": "me", "Y": 123}`)
json.Unmarshal(data, b)
fmt.Println(b)
fmt.Println(b.A)
}
Run Code Online (Sandbox Code Playgroud)
哪些输出:
&{{me 0} hi}
{me 0}
&{{me 0} }
{me 0}
Run Code Online (Sandbox Code Playgroud)
有没有办法多态地将字段 Y 解组为 int 或 string?或者甚至因为 BY 被定义而完全解组为 AY ?
我知道有些人可能会建议使用诸如 之类的东西进行解组 …