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对象中键的顺序。。。