2017-10-14 15 views
1

Je suis en train de désorganiser les éléments suivants YAML (en utilisant gopkg.in/yaml.v2):YAML dynamique Unmarshal à la carte de struct

m: 
    - unit: km 
    formula: magnitude/1000 
    testFixtures: 
     - input: 1000 
     expected: 1 
l: 
    - unit: ml 
    formula: magnitude * 1000 
    testFixtures: 
     - input: 1 
     expected: 1000 

Avec le code suivant:

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) 

Mais il me donne l'erreur suivante:

Error: Received unexpected error: 

yaml: unmarshal errors: 

    line 1: cannot unmarshal !!map into []map[string]main.conversionGroup 

les propriétés de haut niveau sont dynamiques, donc je dois les analyser sous forme de chaîne, toutes les autres clés dans la la structure sera toujours la même, d'où les structures pour ces parties. Comment puis-je analyser cela?

(code complet sont à https://github.com/tirithen/unit-conversion/blob/master/convert.go#L84)

+0

Qu'est-ce que c'est «dynamique YAML»? Il n'y a aucune mention de "dynamique" dans la [spécification YAML] (http://www.yaml.org/spec/1.2/spec.html). De quel «niveau supérieur» parlez-vous? Je supposerais le mappage à la racine de la structure de données représentée par YAML, mais ce mappage n'a aucune propriété, car il ne possède pas d'ancre ni de balise. Veuillez ** modifier ** votre message pour clarifier ce à quoi vous faites référence. – Anthon

Répondre

4

Le problème est que le contenu de votre m et l ne sont pas conversionGroup s mais la liste des conversionGroup s.

Essayez ceci:

conversionGroups := make(map[string][]conversionGroup) 

et il doit analyser. Notez le [] avant conversionGroup.

Alors la question est de savoir si c'est la structure que vous voulez vraiment :)

+0

Merci les crochets manquants était le problème semble-t-il. :) Maintenant, il analyse, je suppose que je pensais que la partie [chaîne] était suffisante. – Tirithen