Unmarshal dynamic YAML to map of structs

元气小坏坏 提交于 2019-12-11 07:01:49

问题


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



来源:https://stackoverflow.com/questions/46749302/unmarshal-dynamic-yaml-to-map-of-structs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!