今天让官方文档虐了几条街。
需要能够对JSON数据进行编码,将内部的中文字符串转成Unicode编码。编码这种东西接触也不少了,随便搜一下就能解决。果断去搜了一下。本文所有编码
rs := []rune("golang中文unicode编码")
j := ""
html := ""
for _, r := range rs {
rint := int(r)
if rint < 128 {
j += string(r)
html += string(r)
} else {
j += "\\u" + strconv.FormatInt(int64(rint), 16) // json
html += "&#" + strconv.Itoa(int(r)) + ";" // 网页
}
}
fmt.Printf("JSON: %s\n", j)
fmt.Printf("HTML: %s\n", html)
Golang里面,所有UTF8字符串里的单个字符,可以使用byte
类型表示,经过[]byte(str)
转换成数组之后,就能进行遍历获取。而对于Unicode,Golang提供了另一种数据类型rune
,经过[]rune(str)
转换之后,就能获取单个Unicode字符。对于英文字符以及英文标点,Unicode编码不变,而中文编码,转成16进制即可。
我们一般认为:UTF-16就是Unicode,以16位两字节为单位,最少为两字节,最多4个字节。
所以,一般情况下,转出的Unicode是4个16进制数字(2字节)组成。最后,为其追加\u
头即可完成。
写完之后,就准备这么转了。结构体数据拼接完之后,把有中文的项单独编码一下。现在想想,硬编码太渣了。
看看官方文档的说法:
Marshal traverses the value v recursively. If an encountered value implements the Marshaler interface and is not a nil pointer, Marshal calls its MarshalJSON method to produce JSON. The nil pointer exception is not strictly necessary but mimics a similar, necessary exception in the behavior of UnmarshalJSON.
调用json.Marshal
方法之后,会递归的访问传入的结构体的每个项,如果遍历到的项实现了Marshaler
的方法,并且该项不是空指针,将会自动调用实现的MarshalJSON
方法。
type QuoteString struct {
QString string
}
func (q QuoteString) MarshalJSON() ([]byte, error) {
return []byte(strconv.QuoteToASCII(q.QString)), nil
}
type ColorGroup struct {
ID int `json:"id,string"`
Name QuoteString `json:"name"`
Colors []string
}
上面定义了一个结构体QuoteString
,它实现了Marshaler
,所以会自动进行Unicode编码。转码,用了strconv
包里的函数QuoteToASCII
。这个方法应该是我上面提供的升级版。
源码很重要。
######参考文献 + 【1】Package json - The Go Programming Language + 【2】golang中文unicode编码 - 豆蔻 + 【3】Package strconv - The Go Programming Language
原文链接:Golang——json数据处理,转载请注明来源!
有疑问加站长微信联系(非本文作者)