Unmarshal dynamic YAML to map of structs

2019-07-29 19:23发布

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条回答
手持菜刀,她持情操
2楼-- · 2019-07-29 19:46

The problem is that the contents of your m and l aren't conversionGroups but lists of conversionGroups.

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 :)

查看更多
登录 后发表回答