想实现功能

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)
}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐