前段时间修改了一个小小的管理系统,本来是挺简单的 按照用户需求显示一些数据,但是却为了一个小小的错误,竟然找了两个晚上的bug,白天上课,所以只能晚上做东西了,好了,进入正题。
一般我们在js中发送一个json对象时,会使用JSON.stringify() 将一个json对象转换为json字符串,再发送.e.g
var obj = {
"item1":"item1",
"item2":"item2",
"item3":"item3"
};
console.log(obj);
console.log(JSON.stringify(obj));
$.ajax({
url: "/test",
type: "POST",
data: {
"data":JSON.stringify(obj)
},
dataType:"json",
success:function(data){
//dosomething
},
error:function(arg_msg){
//dosomething
}
});
可以看到第一次打印obj是一个json对象,而第二次打印是一个stirng,而我们就是要发送这一个json字符串。
首先贴上golang的代码:
type Obj struct {
item1 string `item1`
item2 string `item2`
item3 string `item3`
}
func TestHandle(w http.ResponseWriter, r *http.Request){
fmt.Println("test start...")
obj := Obj{}
r.ParseForm()
temp := r.FormValue("data") //receive value form js
fmt.Println(temp) //type string
err := json.Unmarshal([]byte(temp),&obj)
if(err != nil ){
fmt.Println("json error")
}
fmt.Println(obj.item1) //如果显示成功,说明golang转换json成功
}
然后我们看看golang得到了什么
得到这个字符串了,但是却不能使用obj.item1,为什么呢,golang 结构体当中大写开头的是可导出字符,小写开头的是不可导出字符。就类似于c++中class的public, private,小写只能内部访问,大写就相当于public了。
type Obj struct {
Item1 string `item1`
Item2 string `item2`
Item3 string `item3`
}
obj.Item1就得到了,是不是很简单啊,嘻嘻,感觉这和写c++时找了好几小时的错误,结果就是变量名写错了,少写个分号或者函数声明的参数和函数定义的参数不同的错误一样,就是这么坑。