(联合国)编组json golang不工作

时间:2014-08-31 18:40:04

标签: json go

我正在玩Go并且难以理解为什么json编码和解码对我不起作用

我认为我几乎逐字复制了这些示例,但输出结果表明编组和解组都没有返回数据。他们也不会给出错误。

任何人都可以暗示我出错的地方吗?

我的示例代码: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))
}

输出:

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

在两个输出中我都希望看到解码或编码的json

3 个答案:

答案 0 :(得分:28)

例如,

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))
}

输出:

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

游乐场:

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

导出结构字段。

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

Exported identifiers

     

可以导出标识符以允许从另一个标识符访问它   包。如果两者都导出标识符:

     
      
  • 标识符名称的第一个字符是Unicode大写字母(Unicode类“Lu”);和
  •   
  • 标识符在包块中声明,或者是字段名称或方法名称。
  •   
     

不会导出所有其他标识符。

答案 1 :(得分:3)

大写结构字段的名称

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

更改为:

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

答案 2 :(得分:1)

就我而言,我的结构字段已大写,但我仍然遇到相同的错误。 然后我注意到我的字段的大小写是不同的。我必须在请求中使用下划线。

例如: 我的请求正文是:

{
  "method": "register",
  "userInfo": {
    "fullname": "Karan",
    "email": "email@email.com",
    "password": "random"
  }
}

但我的 golang 结构是:

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

我通过将请求正文修改为:

{
  "method": "register",
  "user_info": {
    "fullname": "Karan",
    "email": "email@email.com",
    "password": "random"
  }
}