Я пытался найти правильный способ вызова внешней структуры для типа map[string]struct
при демаршаллинге JSON.
Код работает, когда он находится в одном пакете, однако, если он извлекает экспортированный тип, то, похоже, произошла ошибка с функцией 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
, вместо этого будут загружены значения структуры по умолчанию. Я должен использовать локальную структуру пакета для значений, чтобы unmarshall правильно.