2013-05-21 6 views
26

Ich versuche, mein Go-Programm zu konfigurieren, indem Sie eine JSON-Datei erstellen und sie in eine Struktur Parsen eine JSON-Datei in eine Struktur mit Go Parse:Wie kann ich

var settings struct { 
    serverMode bool 
    sourceDir string 
    targetDir string 
} 

func main() { 

    // then config file settings 

    configFile, err := os.Open("config.json") 
    if err != nil { 
     printError("opening config file", err.Error()) 
    } 

    jsonParser := json.NewDecoder(configFile) 
    if err = jsonParser.Decode(&settings); err != nil { 
     printError("parsing config file", err.Error()) 
    } 

    fmt.Printf("%v %s %s", settings.serverMode, settings.sourceDir, settings.targetDir) 
    return 
} 

Die config.json Datei:

{ 
    "serverMode": true, 
    "sourceDir": ".", 
    "targetDir": "." 
} 

Das Programm kompiliert und läuft ohne Fehler, aber die print-Anweisung gibt:

false 

(falsch und zwei leere Zeichenfolge s)

Ich habe auch mit json.Unmarshal(..) versucht, hatte aber das gleiche Ergebnis.

Wie analysiere ich den JSON in einer Weise, die die Strukturwerte füllt?

+2

Vergessen Sie nicht, die Datei zu schließen. Zum Beispiel: 'defer configFile.Close()' nach 'configFile, err: = os.Open (" config.json ")' – Kiril

Antwort

33

Sie exportieren nicht Ihre Strukturelemente. Sie beginnen alle mit einem Kleinbuchstaben.

var settings struct { 
    ServerMode bool `json:"serverMode"` 
    SourceDir string `json:"sourceDir"` 
    TargetDir string `json:"targetDir"` 
} 

Machen Sie den ersten Buchstaben Ihres Stuct-Elements Großbuchstaben, um sie zu exportieren. Der JSON-Codierer/Decodierer verwendet keine Strukturelemente, die nicht exportiert werden.

+1

Beachtenswert ist, dass Go ein Element in der Struktur nicht mit einem Element in Ihrem json-Wörterbuch verknüpfen kann (Da dieses Mapping ziemlich benutzerdefiniert ist), müssten Sie go festlegen, welches Element im json-Dictionary an das entsprechende struct-Element gebunden werden soll. – sabhiram