如何在Go中生成带有排序键的JSON?

she*_*eki 16 json go

在python中,您可以通过按顺序生成带有键的JSON

import json
print json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4, separators=(',', ': '))
Run Code Online (Sandbox Code Playgroud)

我没有在Go找到类似的选项.我有什么想法可以实现类似的行为吗?

Gus*_*yer 47

json包总是在编组时订购密钥.特别:

  • 地图的按键按字典顺序排列

  • 结构键按结构中定义的顺序编组

实施在这里ATM:

  • 结构键怎么样?订单是否记录在案? (5认同)
  • 现在记录在案:https://golang.org/pkg/encoding/json/#Marshal:地图值编码为 JSON 对象。映射的键类型必须是字符串、整数类型或实现 encoding.TextMarshaler。通过应用以下规则对映射键进行排序并用作 JSON 对象键,受上述字符串值描述的 UTF-8 强制约束 (3认同)
  • 噪音。我想知道为什么编码/json 文档没有提到这个关键属性。 (2认同)

Rad*_*nka 5

Gustavo Niemeyer 给出了很好的答案,只是一个方便的小片段,我用来在需要时验证和重新排序/规范化 json 的 []byte 表示

func JsonRemarshal(bytes []byte) ([]byte, error) {
    var ifce interface{}
    err := json.Unmarshal(bytes, &ifce)
    if err != nil {
        return []byte{}, err
    }
    output, err := json.Marshal(ifce)
    if err != nil {
        return []byte{}, err
    }
    return output, nil
}
Run Code Online (Sandbox Code Playgroud)

  • 它不应该,json 和 go 中的切片(数组)都有特定的顺序,而映射是索引的。事实上,您可以说数组中项目的顺序*就是*数据。最初的问题是关于“键”,因此是关于地图。对数组重新排序将被视为错误。 (4认同)