2017-08-17 5 views
-3

Je dispose d'un fichier JSON, contenant abondance de données:la structure unmarshaling JSON en aller faire des cartes vides

{"elec":{ 
    "s20":{ 
     "coldS":{ 
      "wDay": { 
       "Night": {"avg": 1234, "stddev": 56}, 
       "Morning": {"avg": 5432, "stddev": 10} 
       ... 
      }, 
      ... 
     }, 
     ... 
    }, 
    ... 
} 

Je veux charger ce fichier en tant que structure de go:

type ConsumConfig struct { 
    elec map[string]map[string]map[string]map[string]ConsumConfValue `json:"elec"` 
    gas map[string]map[string]map[string]map[string]ConsumConfValue `json:"gas"` 
} 

type ConsumConfValue struct { 
    avg int `json:"avg"` 
    stdev int `json:"stddev"` 
} 

Quand je fais données de fichier unmarshaling, j'obtiens un objet de valeur zéro de mon type struct au lieu d'un objet plein de données (obtention elec = map[] et gas = map[]). Donc quand j'accède à la valeur de cette carte, j'obtiens des valeurs nulles (donc 0 car il y a des entiers).

Il n'y a aucune erreur de compilation ou d'exécution. J'essaie de trouver s'il y a eu un problème de nom de fichier ou si mon fichier contient des zéros, mais ce n'est pas le cas; il y a le fichier (qui est chargé avec succès comme un tableau d'octets), contenant des valeurs différentes de 0.

Voici mon code pour désorganiser le fichier:

func GetConsumConfig(climatFilePath string) ConsumConfig { 
    fileBytes, err := ioutil.ReadFile(climatFilePath) // get file as byte array 
    if err != nil { 
     panic(err) 
    } 

    var configConsum ConsumConfig 
    err = json.Unmarshal(fileBytes, &configConsum) // byte array as struct 
    if err != nil { 
     panic(err) 
    } 

    return configConsum 
} 

Et voici le test que je fais pour voir qu'il n'y a rien à l'intérieur de l'objet retourné:

fmt.Println("0...", climatFilePath) 
for a, b := range returnedConfigConsum.elec { 
    fmt.Println(a, ": ", b) 
} 
fmt.Println("1...") 
for a, b := range returnedConfigConsum.gas { 
    fmt.Println(a, ": ", b) 
} 
fmt.Println("2...") 

Et voici l'impression juste que:

0... file/path.json 
1... 
2... 

Au lieu de quelque chose comme

0... file/path.json 
s20: map[..] 
s50: map[..] 
s75: map[..] 
1... 
s20: map[..] 
s50: map[..] 
s75: map[..] 
2... 

Répondre

1

Ceci est parce que vos elec et gas les champs sont minuscules. json.Unmarshal ne touchera que les champs commençant par une majuscule. Les renommer en Elec et Gas devrait probablement résoudre le problème.

+0

Oh ok, je comprends pourquoi le -1 sur ma question x) Je ne suis pas habitué à ces changements majuscules/minuscules comment fonctionnent les programmes ... Merci (je pense que je vais supprimer cette question bientôt ...); Notez que je dois aussi changer 'avg' et' stdev' en 'avg' et' Stdev' aussi (chose difficile à ne pas fonctionner en raison d'un minuscule) – NatNgs