Golang——json数据处理

Bryce · · 1479 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

今天让官方文档虐了几条街。

需要能够对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数据处理,转载请注明来源!


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

本文来自:Cyeam

感谢作者:Bryce

查看原文:Golang——json数据处理

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

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