38
7.2.md
38
7.2.md
@@ -97,7 +97,7 @@ JSON(Javascript 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 @@ JSON(Javascript 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编码进入死循环
|
||||
|
||||
Reference in New Issue
Block a user