Toad
Toad

Reputation: 15925

(un)marshalling json golang not working

I'm playing with Go and am stumped as to why json encode and decode don't work for me

I think i copied the examples almost verbatim, but the output says both marshal and unmarshal return no data. They also don't give an error.

can anyone hint to where i'm going wrong?

my sample code: Go playground

package main

import "fmt"
import  "encoding/json"

type testStruct struct {
    clip string `json:"clip"`
}

func main() {
//unmarshal test
    var testJson = "{\"clip\":\"test\"}"
    var t testStruct
    var jsonData = []byte(testJson)
    err := json.Unmarshal(jsonData, &t)
    if err != nil {
        fmt.Printf("There was an error decoding the json. err = %s", err)
        return
    }
    fmt.Printf("contents of decoded json is: %#v\r\n", t)

//marshal test
    t.clip = "test2"
    data, err := json.Marshal(&t)
    if err != nil {
         fmt.Printf("There was an error encoding the json. err = %s", err)
         return
    }
    fmt.Printf("encoded json = %s\r\n", string(data))
}

output:

 contents of decoded json is: main.testStruct{clip:""}
 encoded json = {}

in both outputs I would have expected to see the decoded or encoded json

Upvotes: 37

Views: 31393

Answers (3)

Karan Singh
Karan Singh

Reputation: 1164

In my case, my struct fields were capitalized but I was still getting the same error. Then I noticed that the casing of my fields was different. I had to use underscores in my request.

For eg: My request body was:

{
  "method": "register",
  "userInfo": {
    "fullname": "Karan",
    "email": "[email protected]",
    "password": "random"
  }
}

But my golang struct was:

type AuthRequest struct {
    Method   string   `json:"method,omitempty"`
    UserInfo UserInfo `json:"user_info,omitempty"`
}

I solved this by modifying my request body to:

{
  "method": "register",
  "user_info": {
    "fullname": "Karan",
    "email": "[email protected]",
    "password": "random"
  }
}

Upvotes: 2

Yurkol
Yurkol

Reputation: 1482

Capitalize names of structure fields

type testStruct struct {
    clip string `json:"clip"` // Wrong.  Lowercase - other packages can't access it
}

Change to:

type testStruct struct {
    Clip string `json:"clip"`
}

Upvotes: 32

peterSO
peterSO

Reputation: 166569

For example,

package main

import "fmt"
import "encoding/json"

type testStruct struct {
    Clip string `json:"clip"`
}

func main() {
    //unmarshal test
    var testJson = "{\"clip\":\"test\"}"
    var t testStruct
    var jsonData = []byte(testJson)
    err := json.Unmarshal(jsonData, &t)
    if err != nil {
        fmt.Printf("There was an error decoding the json. err = %s", err)
        return
    }
    fmt.Printf("contents of decoded json is: %#v\r\n", t)

    //marshal test
    t.Clip = "test2"
    data, err := json.Marshal(&t)
    if err != nil {
        fmt.Printf("There was an error encoding the json. err = %s", err)
        return
    }
    fmt.Printf("encoded json = %s\r\n", string(data))
}

Output:

contents of decoded json is: main.testStruct{Clip:"test"}
encoded json = {"clip":"test2"}

Playground:

http://play.golang.org/p/3XaVougMTE

Export the struct fields.

type testStruct struct {
    Clip string `json:"clip"`
}

Exported identifiers

An identifier may be exported to permit access to it from another package. An identifier is exported if both:

  • the first character of the identifier's name is a Unicode upper case letter (Unicode class "Lu"); and
  • the identifier is declared in the package block or it is a field name or method name.

All other identifiers are not exported.

Upvotes: 54

Related Questions