title: Modifying JSON file using Golang
body: <p>I am attempting to read in a JSON file in Golang, modifying this JSON file, and then creating a new JSON file/writing over this JSON file. I have seen several samples online, but can't seem to put two and two together to get the required result. I tried just making my own JSON str in GO and modifying that, but have still failed. </p>
  
  <pre><code>package main
  
  import (
      "encoding/json"
      "fmt"
  )
  
  type Person struct {
      Name    string
      Age     int
      Details interface{}
  }
  
  func main() {
      //I created a simple Json structure here to play with
      str := `{"name": "A",
          "age":20,
          "details": {"salary":100000000}
      }`
      var data Person
  
      err := json.Unmarshal([]byte(str), &amp;data)
      if err != nil {
          panic(err)
      }
  
      //I make a map so that I can adjust the value of the salary
      details, ok := data.Details.(map[string]interface{})
      if ok {
          details["salary"] = 999999
      }
      //Change the other values of a Person
      data.Name = "B"
      data.Age = 19
      fmt.Println(data)
  
      //SAMPLE OUTPUT: {B 19 map[salary:999999]}
  }
  </code></pre>
  
  <p>I have made several attempts with reading the file, below is my best attempt:</p>
  
  <pre><code>package main
  
  import (
      "encoding/json"
      "fmt"
      "io/ioutil"
      "os"
  )
  
  /* Create the structure that follows the outline of the JSON file*/
  
  type UserType struct {
      User []struct {
          CdbID     string `json:"cdb_id"`
          Firstname string `json:"firstname"`
          Lastname  string `json:"lastname"`
          Phone     int64  `json:"phone"`
          Email     string `json:"email"`
          Address   []struct {
              Street  string `json:"street"`
              City    string `json:"city"`
              Zip     string `json:"zip"`
              Country string `json:"country"`
          } `json:"address"`
          Authenticators []struct {
              Name  string `json:"name"`
              Phone int64  `json:"phone"`
          } `json:"authenticators"`
          VoiceSig            string `json:"voice_sig"`
          VoicesigCreatedTime string `json:"voicesig_created_time"`
          Status              string `json:"status"`
      } `json:"user"`
  }
  
  func main() {
      file, err := ioutil.ReadFile("user.json") //Read File
      if err != nil {
          fmt.Print("Error:", err)
      }
  
      var u UserType
      json.Unmarshal(file, &amp;u)     //Parse the Json-encoded Data and store the results in u
      result, e := json.Marshal(u) //Returns the Json encoding of u into the variable result
      if e != nil {
          fmt.Println("error", err)
      }
      os.Stdout.Write(result) //The line of code golang.org uses to print  the Json encoding
  }
  </code></pre>
  
  <p>This is a sample output:</p>
  
  <pre><code>{
      "user": [{
          "cdb_id":"",
          "firstname":"Tom",
          "lastname":"Bradley",
          "phone":14155555555,
          "email":"tom@gmail.com",
          "address":[{
              "street":"4343 shoemaker ave",
              "city":"Brea",
              "zip":"92821",
              "country":"USA"
          }],
          "authenticators":[{
              "name":"Lisa Hayden",
              "phone":15625555555
          },{
              "name":"Pavan M",
              "phone":17145555555
          }],
          "voice_sig":"242y5-4546-555kk54-437879ek545",
          "voicesig_created_time":"2017-08-02T21:27:44+0000",
          "status":"verified"
      }]
  }
  </code></pre>
  
  <p>I am just confused on how to modify what I want, specifically the "Authenticators" of the aforementioned sample output. Thanks!</p>