无法直接将外部结构调用到map [string] struct上

时间:2019-04-11 14:37:16

标签: json go struct package unmarshalling

我一直在努力找出解组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中,而将加载默认结构值。我必须使用本地包结构来使值正确解组。

1 个答案:

答案 0 :(得分:0)

很抱歉,上面的代码有效,事实证明这是流氓的一部分 func (e *Bird) UnmarshalJSON(b []byte) error {}我在此上浪费了很多时间:(