我一直在努力找出解组JSON时为map[string]struct
类型调用外部结构的正确方法。
代码都在同一个包中时有效,但是,如果要提取导出的类型,则Unmarshal函数似乎出现错误。
package animals
type Bird struct {
Name string `json:"name"`
Description string `json:"description"`
}
package main
import (
"encoding/json"
"fmt"
"../animal"
)
func main() {
birdJson := `{"birds":{"name":"eagle","description":"bird of prey"}}`
var result map[string]animals.Bird //If Bird is external (animals.Bird) then the Unmarshal breaks
json.Unmarshal([]byte(birdJson), &result)
birds := result["birds"]
fmt.Printf("%s: %s", birds.Name, birds.Description)
// These entries will be the struct defaults instead of the values in birdJson
}
https://play.golang.org/p/e4FGIFath4s
所以上面的代码工作正常,但是如果type Bird struct{}
是从另一个包导入的,那么当我设置map[string]animals.Bird
时,json.Unmarshal无法正常工作。
我发现的解决方法是像这样设置一个新类型:
type Bird animals.Bird
。有更优雅的方法吗?
如果将来的功能需要原始的animal.Bird struct
,这将成为一个更大的问题,并且在尝试使用新的本地类型时会出错。
更新:
我已经更新了上面的代码以显示无效的示例。问题是值将无法正确加载到map[string]animals.Bird
中,而将加载默认结构值。我必须使用本地包结构来使值正确解组。
答案 0 :(得分:0)
很抱歉,上面的代码有效,事实证明这是流氓的一部分
func (e *Bird) UnmarshalJSON(b []byte) error {}
我在此上浪费了很多时间:(