52

I'm trying to configure my Go program by creating a JSON file and parsing it into a struct:

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
}

The config.json file:

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

The Program compiles and runs without any errors, but the print statement outputs:

false  

(false and two empty strings)

I've also tried with json.Unmarshal(..) but had the same result.

How do I parse the JSON in a way that fills the struct values?

1
  • 4
    Don't forget to close the file. For example: defer configFile.Close() after configFile, err := os.Open("config.json") Commented Apr 3, 2014 at 12:01

1 Answer 1

58

You're not exporting your struct elements. They all begin with a lower case letter.

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

Make the first letter of your stuct elements upper case to export them. The JSON encoder/decoder wont use struct elements which are not exported.

Sign up to request clarification or add additional context in comments.

1 Comment

Its worth noting that because Go cannot associate an element in the struct to some element in your json dictionary (since that mapping is pretty much user defined), you would need to use tags to tell Go which element in the json dictionary you want bound to the corresponding struct element.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.