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)
The problem is that the contents of your
m
andl
aren'tconversionGroup
s but lists ofconversionGroup
s.Try this:
and it should parse. Note the
[]
beforeconversionGroup
.Then the question is whether that's the structure you really want :)