golang json 问题

lzc_sys · 2018-04-24 14:15:19 · 1114 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-04-24 14:15:19 的主题,其中的信息可能已经有所发展或是发生改变。

代码如下:一个简单的http代码

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "strconv"
)

// People ...
type People struct {
    name string
    age  int
}

// IndexHandler ...
func IndexHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "hello go http server")
}

func (p People) toString() string {
    return "name : " + p.name + ", age : " + strconv.Itoa(p.age)
}

// FormTest ...
func FormTest(w http.ResponseWriter, r *http.Request) {
    //fmt.Fprintln(w, "FormTest")
    r.ParseForm()
    fmt.Println(r.Form)
    fmt.Println("Path : ", r.URL.Path)
    fmt.Println("Scheme : ", r.URL.Scheme)
    fmt.Println("url_long : ", r.Form["url_long"])

    for k, v := range r.Form {
        fmt.Println("k, v : ", k, v)
    }

    var p People
    p.name = r.Form["name"][0]
    p.age, _ = strconv.Atoi(r.Form["age"][0])
    fmt.Println("p : ", p.toString())

    data, err := json.Marshal(p)
    fmt.Println(string(data))

    if err != nil {
        fmt.Println("error : ", err)
    } else {
        fmt.Fprintln(w, string(data))
    }
}

func main() {
    fmt.Println("server start ...")
    http.HandleFunc("/", IndexHandler)
    http.HandleFunc("/formtest", FormTest)
    http.ListenAndServe("127.0.0.1:4199", nil)
}

我的表单数据通过formtest接口提交上来之后,数据是存在的,但是格式化为json数据的时候出错,只有一个{},没有具体内容。 输出结果如下,请大佬们帮忙看下什么原因?

server start ...
map[age:[12] name:[xxxxxx]]
Path :  /formtest
Scheme :
url_long :  []
k, v :  name [xxxxxx]
k, v :  age [12]
p :  name : xxxxxx, age : 12
{}
exit status 2

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1114 次点击  
加入收藏 微博
4 回复  |  直到 2018-04-25 10:30:51
dong-hao
dong-hao · #1 · 7年之前

原因在于,json.Marshal 在处理 struct 的时候,只会处理那些 "exported fields",也就是说,必须是首字母大写的 field name,对于你的例子,应该这么改:

type People struct {
    Name string
    Age  int
}

对于 struct 而言,field name 大写是个最佳实践,除非你确定不要被外部引用,否则都要大写。

lzc_sys
lzc_sys · #2 · 7年之前
dong-haodong-hao #1 回复

原因在于,json.Marshal 在处理 struct 的时候,只会处理那些 "exported fields",也就是说,必须是首字母大写的 field name,对于你的例子,应该这么改: ```go type People struct { Name string Age int } ``` 对于 struct 而言,field name 大写是个最佳实践,除非你确定不要被外部引用,否则都要大写。

谢谢咯,还真可以。。

_admin_
_admin_ · #3 · 7年之前
lzc_syslzc_sys #2 回复

#1楼 @dong-hao 谢谢咯,还真可以。。

最好给struct加上tag, type People struct { Name string json:"name" Age int json:"age" }

_admin_
_admin_ · #4 · 7年之前
lzc_syslzc_sys #2 回复

#1楼 @dong-hao 谢谢咯,还真可以。。

最好给struct加上tag, type People struct { Name string json:"name" Age int json:"age" }

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传