想实现功能
json 转 map 时按照json的顺序给 map 赋值并保持 map 中 key 的顺序
map 转 json 时按照 map 中 key 的顺序转为 json 字符串
参考文章
https://www.haoyizebo.com/posts/7a38ee65/
https://github.com/virtuald/go-ordered-json
go语言内置的 map 是一个普通的 hashmap,是无序的,每次遍历 map 时都会有不同的顺序
go语言自带的 json 包序列化 map 转 json 字符串时,不完全是无序的,是保持一种特定的规则排序,并且不能改变,这种规则就是按照 key 的ascii码值排序
实现方法
如上面文章介绍,之前有人试图给 Go 标准库提交过相关的代码,但是被拒绝了((沮丧脸) 详情可见 7930: encoding/json: Optionally preserve the key order of JSON objects ),不过在 GitHub 上还是能找到相关的代码的:go-ordered-json,我们就可以用使用这个库来完成。
具体的使用方法就是使用"github.com/virtuald/go-ordered-json"
包中的json.OrderedObject 类型取代 map 类型,并使用上面包提供的序列化与序列化方法
说明:这个包的代码有一些不规范的地方,就是引入的包名和代码文件中的package名字是不一样的,文件中的package是json,然而引入的包名是github.com/virtuald/go-ordered-json,因些使用起来会稍感别扭,当然为什么这样就不得面知了,不过好用就行
示例代码:
package main
import (
"fmt"
"github.com/virtuald/go-ordered-json"
)
func main() {
jsonString := `{
"b": "2",
"a": "1",
"c": "3"
}`
oo := json.OrderedObject{}
err := json.Unmarshal([]byte(jsonString), &oo)
if err != nil {
panic(err)
}
fmt.Printf("%+v", oo)
}