Merge pull request #52 from xueliangwei/master

修正对于tag描述的小错误,增加几个tag样例
This commit is contained in:
astaxie
2012-10-06 02:46:23 -07:00

38
7.2.md
View File

@@ -97,7 +97,7 @@ JSONJavascript Object Notation是一种轻量级的数据交换语言
fmt.Println(k, "is of a type I don't know how to handle")
}
}
通过上面的示例可以看到通过interface{}与type assert的配合我们就可以解析未知结构的JSON数了。
通过上面的示例可以看到通过interface{}与type assert的配合我们就可以解析未知结构的JSON数了。
上面这个是官方提供的解决方案其实很多时候我们通过类型断言操作起来不是很方便目前bitly公司开源了一个叫做`simplejson`的包,在处理未知结构体的JSON时相当方便详细例子如下所示
@@ -171,13 +171,43 @@ JSONJavascript Object Notation是一种轻量级的数据交换语言
针对JSON的输出我们在定义struct tag的时候需要注意的几点是:
- tag中带有`"-"`那么这个字段不会输出到JSON
- 字段的tag是`"-"`那么这个字段不会输出到JSON
- tag中带有自定义名称那么这个自定义名称会出现在JSON的字段名中例如上面例子中serverName
- tag中如果带有`"omitempty"`那么如果该字段值为空就不会输出到JSON串中
- 如果字段类型是int而tag中带有`"string"`那么这个字段在输出到JSON的时候会把该字段对应的值转换成JSON字符串
- tag中如果带有`"omitempty"`选项那么如果该字段值为空就不会输出到JSON串中
- 如果字段类型是bool, string, int, int64等而tag中带有`",string"`选项那么这个字段在输出到JSON的时候会把该字段对应的值转换成JSON字符串
举例来说:
type Server struct {
// ID 不会导出到JSON中
ID int `json:"-"`
// ServerName 的值会进行二次JSON编码
ServerName string `json:"serverName"`
ServerName2 string `json:"serverName2,string"`
// 如果 ServerIP 为空则不输出到JSON串中
ServerIP string `json:"serverIP,omitempty"`
}
s := Server {
ID: 3,
ServerName: `Go "1.0" `,
ServerName2: `Go "1.0" `,
ServerIP: ``,
}
b, _ := json.Marshal(s)
os.Stdout.Write(b)
会输出以下内容:
{"serverName":"Go \"1.0\" ","serverName2":"\"Go \\\"1.0\\\" \""}
Marshal函数只有在转换成功的时候才会返回数据在转换的过程中我们需要注意几点
- JSON对象只支持string作为key所以要编码一个map那么必须是map[string]T这种类型(T是Go语言中任意的类型)
- Channel, complex和function是不能被编码成JSON的
- 嵌套的数据是不能编码的不然会让JSON编码进入死循环