问题
I'm trying to unmarshal the following YAML (using gopkg.in/yaml.v2):
m:
- unit: km
formula: magnitude / 1000
testFixtures:
- input: 1000
expected: 1
l:
- unit: ml
formula: magnitude * 1000
testFixtures:
- input: 1
expected: 1000
With the following code:
type ConversionTestFixture struct {
Input float64 `yaml:"input"`
Expected float64 `yaml:"expected"`
}
type conversionGroup struct {
Unit string `yaml:"unit"`
Formula string `yaml:"formula"`
TestFixtures []ConversionTestFixture `yaml:"testFixtures"`
}
conversionGroups := make(map[string]conversionGroup)
err = yaml.Unmarshal([]byte(raw), &conversionGroups)
if err != nil {
return
}
fmt.Println("conversionGroups", conversionGroups)
But it gives me the following error:
Error: Received unexpected error:
yaml: unmarshal errors:
line 1: cannot unmarshal !!map into []map[string]main.conversionGroup
The top level properties are dynamic so I need to parse them as string, every other key in the structure will always be the same, hence the structs for those parts. How can I parse this?
(full code are at https://github.com/tirithen/unit-conversion/blob/master/convert.go#L84)
回答1:
The problem is that the contents of your m
and l
aren't conversionGroup
s but lists of conversionGroup
s.
Try this:
conversionGroups := make(map[string][]conversionGroup)
and it should parse. Note the []
before conversionGroup
.
Then the question is whether that's the structure you really want :)
来源:https://stackoverflow.com/questions/46749302/unmarshal-dynamic-yaml-to-map-of-structs