Sorting 如何防止地图排序?
我有一张地图Sorting 如何防止地图排序?,sorting,dictionary,go,Sorting,Dictionary,Go,我有一张地图 { "m_key": 123, "z_key": 123, "a_key": 123, "f_key": 123 } 当我试图从中生成json并打印它时,我的json将按键排序,我得到json: { "a_key": 123, "f_key": 123, "m_key": 123, "z_key": 123 } 要回答原始问题,请使用有序地图 package main import ( "encoding/json" "fmt" "github.com
{
"m_key": 123,
"z_key": 123,
"a_key": 123,
"f_key": 123
}
当我试图从中生成json并打印它时,我的json将按键排序,我得到json:
{
"a_key": 123,
"f_key": 123,
"m_key": 123,
"z_key": 123
}
要回答原始问题,请使用有序地图
package main
import (
"encoding/json"
"fmt"
"github.com/iancoleman/orderedmap"
)
func main() {
o := orderedmap.New()
// use Set instead of o["a"] = 1
o.Set("m_key", "123") // go json.Marshall doesn't like integers
o.Set("z_key", "123")
o.Set("a_key", "123")
o.Set("f_key", "123")
// serialize to a json string using encoding/json
prettyBytes, _ := json.Marshal(o)
fmt.Printf("%s", prettyBytes)
}
但是根据规范
不能保证映射的顺序是正确的,因此最好使用数组代替json输出
// convert to array
fmt.Printf("\n\n\n")
arr := make([]string, 8)
c := 0
for _, k := range o.Keys() {
arr[c] = k
c++
v, _ := o.Get(k)
arr[c], _ = v.(string)
c++
}
morePretty, _ := json.Marshal(arr)
fmt.Printf("%s", morePretty)
当重新加载数组时,它将按照正确的顺序进行映射没有顺序,因此初始映射只是一组键值对。
json
包按键对条目进行排序,以提供一致的输出。否则,输出中的条目将以随机顺序出现,并且只是偶尔以与输入相同的顺序出现。所以如果订单很重要,你必须有一些数据结构来描述你的订单,请发布。要在输出中保持该顺序,必须编写自定义封送拆收器。如果您没有任何指定顺序的东西,那么这两个映射被认为是相同的。您不应该依赖JSON对象中键的顺序。。。