title: Deserializing nested JSON, or simply pass it forward in Go
body: <p>Building a basic API with Go, I've got JSON stored in a JSON field in a postgres table, along with some other (plain) datatypes. Using my model, I'm simply trying to fetch a row from the database and pass it forward as JSON.</p>
  
  <p>Using <a href="https://github.com/jinzhu/gorm" rel="nofollow">GORM</a> to deserialize the data into a struct, most of the mapping happens seamlessly, except for the JSON, which depending on selected datatype either renders as a bytearray or string.</p>
  
  <p>Here are the models (Updated):</p>
  
  <pre><code>type Item struct {
      --snip--
      Stats []ItemInfo `gorm:"column:stats" json:"stats" sql:"json"`
      --snip--
  }
  
  type ItemInfo struct {
      Stat        string      `json:"stat"`
      Amount      int         `json:"amount"`
  }
  </code></pre>
  
  <p>With the typical JSON looking like this (from the DB):</p>
  
  <pre><code>[{"stat": "Multistrike", "amount": 193}, {"stat": "Crit", "amount": 145}, 
   {"stat": "Agility", "amount": 254}, {"stat": "Stamina", "amount": 381}]
  </code></pre>
  
  <p>So the idea is that I simply want to pass this data on, not alter it, or deserialize it to a Go struct or anything. The controller/route follows:</p>
  
  <pre><code>func GetItem(c *gin.Context) {
      id, err := strconv.Atoi(c.Param("id"))
  
      // Convert Parameter to int, for db query
      if err != nil {
          panic(err)
      }
  
      // Get the DB context
      db, ok := c.MustGet("databaseConnection").(gorm.DB)
      if !ok {
          // Do something
      }
  
      // Hold the structified item here.
      var returnedItem models.Item
  
      // Get the db row
      db.Where(&amp;models.Item{ItemID: id}).First(&amp;returnedItem)
  
      if c.Bind(&amp;returnedItem) == nil {
  
          // Respond with the struct as json
          c.JSON(http.StatusOK, returnedItem)
      }
  }
  </code></pre>
  
  <p>Which responds with the following JSON (with stats as json.RawMessage):</p>
  
  <pre><code>{
  
      "context": "raid-finder",
      "stats": "W3sic3RhdCI6ICJWZXJzYXRpbGl0eSIsICJhbW91bnQiOiA0NX0sIHsic3RhdCI6ICJDcml0IiwgImFtb3VudCI6IDEwMH0sIHsic3RhdCI6ICJBZ2lsaXR5IiwgImFtb3VudCI6IDEwOX0sIHsic3RhdCI6ICJTdGFtaW5hIiwgImFtb3VudCI6IDE2M31d",
  }
  </code></pre>
  
  <p>Or alternatively (with stats as string):</p>
  
  <pre><code>{
      "context": "raid-finder",
      "stats": "[{\"stat\": \"Versatility\", \"amount\": 45}, {\"stat\": \"Crit\", \"amount\": 100}, {\"stat\": \"Agility\", \"amount\": 109}, {\"stat\": \"Stamina\", \"amount\": 163}]",
  }
  </code></pre>
  
  <p>What options do I have to simply pass this on, so far I've unsuccessfully attempted to map the JSON to a struct (which becomes difficult because of the dynamic data, and the reason I chose JSON to start with)?</p>
  
  <p>I realize there's some magic going on from <a href="https://github.com/gin-gonic/gin" rel="nofollow">gin-gonic</a>, with c.JSON automatically(?) marshalling all of the data from the struct to JSON, but hoping there's some way to avoid marshalling the json data?</p>
  
  <p>When ran with the ItemInfo substruct, it panics with the following error:</p>
  
  <pre><code>2016/01/07 08:21:08 Panic recovery -&gt; reflect.Set: value of type []uint8 is not assignable to type []models.ItemInfo
  /usr/local/go/src/runtime/panic.go:423 (0x42a929)
          gopanic: reflectcall(nil, unsafe.Pointer(d.fn), deferArgs(d), uint32(d.siz), uint32(d.siz))
  /usr/local/go/src/reflect/value.go:2158 (0x5492ce)
          Value.assignTo: panic(context + ": value of type " + v.typ.String() + " is not assignable to type " + dst.String())
  /usr/local/go/src/reflect/value.go:1327 (0x546195)
  </code></pre>
  
  <p>EDIT: Updated code:</p>