2013-05-21 15 views
26

Sto cercando di configurare il mio programma di Go creando un file JSON e l'analisi in una struct:Come posso analizzare un file JSON in una struct con Go

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 
} 

Il file config.json:

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

Il programma viene compilato ed eseguito senza errori, ma le uscite istruzione print:

false 

(false e due stringa vuota s)

Ho anche provato con json.Unmarshal(..) ma ho avuto lo stesso risultato.

Come analizzare il JSON in modo da riempire i valori della struttura?

+2

Non dimenticare di chiudere il file. Ad esempio: 'defer configFile.Close()' dopo 'configFile, err: = os.Open (" config.json ")' – Kiril

risposta

33

Non stai esportando gli elementi della struttura. Iniziano tutti con una lettera minuscola.

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

Effettuare la prima lettera degli elementi di statura maiuscola per esportarli. Il codificatore/decodificatore JSON non usa elementi struct che non vengono esportati.

+1

Vale la pena notare che, poiché Go non può associare un elemento nella struct a qualche elemento nel dizionario json (dal momento che tale mappatura è praticamente definita dall'utente), è necessario utilizzare i tag per indicare a Go quale elemento del dizionario json si desidera associare all'elemento struct corrispondente. – sabhiram

Problemi correlati